Newsgroup: it.comp.lang.c
Titolo: Cygnus GNU & Win32

Ciao a tutti.
Sono recentemente migrato dall' ambiente M$ Visual C++ 5.0 per passare a
Cygnus GNU per Win32, poiché il primo lo ritenevo un modo troppo costoso di
programmare.
La mia migrazione però non é stata così felice: il mio nuovo compilatore mi
da diversi errori in fase di link se tento di compilare un programma
in C che fa uso dell'API di Win32. Le librerie ci sono, ne sono sicuro, ma
ogni funzione dell'API mi viene etichettata come "Unknown reference".
Cosa devo fare?
[ Il mio sistema operativo é Windows 98 ]
P.S. Scusate la domanda banale, ma sono alle prime armi con i compilatori un
pò seri...

Ciao, UDA.
Scusa, avevo tralasciato per fretta alcune cosine...
Io eseguo:
 gcc prova.c
e mi da le funzioni dell'API come sconosciute.
Non le ho linkate perchč pensavo che se le andasse a cercare da solo nella
directory standard delle librerie.
Perň poi ho provato come hai detto tu a scrivere:
 gcc prova.c -L\Programmi\Cygnus.....\lib\ -l libwin32spl.a
ma non funziona ancora.
Cosa sbaglio?
E poi, qual'é la libreria che devo linkare? Nella mia mail ho scritto
libwin32spl.a a titolo di esempio, ma non ho idea di quale devo linkare.
Ciao.

 Ciao.
Guarda, ti metto il primo makefile che ho trovato:
# Makefile del programma: MessageBox
  NOCONSOLE = -Wl,-subsystem,windows
  LIBRARY = -lUser32 -lKernel32 -lGDI32
  TARGET = MessageBox.exe
  SOURCE = MessageBox.cpp
  COMMAND = gcc -o
  $(TARGET) : $(SOURCE)
          $(COMMAND) $(TARGET) $(SOURCE) $(LIBRARY) $(NOCONSOLE)
****
Diciamo che:
1) "-Wl,-subsystem,windows" (che viene memorizzata nella Variabile
$(NOCONSOLE) ), serve per fare in modo che, lanciando il tuo programma
Win, non venga aperta anche una Finestra DOS (tipo la Shell di MS-DOS,
tanto per intenderci).
2) "-lUser32 -lKernel32 -lGDI32" (variabile $(LIBRARY) ) sono le
librerie che devi Linkare affinche' il compilatore trovi le API (base)
di Windows; a causa di un errore del compilatore (almeno, cosi' un Guru
mi aveva riferito a suo tempo), potresti avere dei problemi linkando
anche  Kernel32.
Se, quando lanci il programma, ti appare il solito messaggino di Windows
(il quale sembra divertirsi a mostrarlo frequentemente ;) ) che informa
con "Questo programma ha causato ...... e verra' chiuso", devi Linkare
cosi': -lUser32 -lGDI32 .
Ovviamente si tratta delle librerie Base .... potresti averne bisogno
anche di altre, ma la sintassi e' uguale.
3) $(TARGET) e $(SOURCE) mi sembrano evidenti ;)
4) L'opzione  -o  serve per dire a GCC di creare come Output (cioe' il
programma risultante dalla compilazione/Linkaggio) il nome del file
indicato successivamente (che nel nostro caso e', appunto, $(TARGET) e
cioe' MessageBox.exe).
Ora, io sono poco esperto e non so quale sia il sistema "ortodosso" di
operare ma, in genere, quando Includo (o includevo) delle funzioni
dell'API presenti in librerie che non ho Linkato, faccio una ricerca
(grep) dei Nomi dei Simboli che il compilatore dice di non trovare
(nelle dir. /lib, ad esempio) e le "linko".
Se ad esempio trovo che il simbolo _pippo() si trova nella libreria
libpippo.a dovro' Linkare quest'ultima con una sintassi del tipo:
 gcc -o ..... ecc ... -lpippo
Ti faccio inoltre notare che il file libpippo.a si deve trovare lungo il
percorso di ricerca utilizzato dal compilatore; se vuoi aggiungere altre
Directory a questo percorso hai due possibilita':
1) Modifichi la Variabile di Ambiente DOS (non chiedermi qual'e' perche'
e' da mesi che non uso DOS/Win e non la ricordo .... nella doc pero' ci
dovrebbe essere).
2) Usi questa sintassi:
 gcc -o ..... ecc ... -L/miadirectory/lib -lpippo
OK (?;-)
Ciao, UDA.
PS: sotto Windows sappi che il makefile devi salvarlo in formato UNIX
altrimenti il make credo non lo veda.
-- 
<><><><><><><><><><><><><><><><><><><><><><><><
UDA'Software
mailto:
uda.so...@iol.it
http://www.GeoCities.com/SiliconValley/Bay/2165