Newsgroup: it.comp.os.linux.development
Titolo: Compilare: staticamente e/o dinamicamente

Dopo aver provato su it.comp.lang.c, ed essere stato indirizzato qui, vi
propongo un problemino che mi sta facendo perdere parecchio tempo:
Devo compilare un programmino (un CGI in C) che usa le seguenti librerie:
- gd (librerie di elaborazione dell'immagine)
- jpeg (richiesta da gd)
- z (richieste da jpeg)
- m (richieste un po da tutti)
Il mio sistema e' un linux (debian woody, kernel 2.4.20, gcc 3.2), mentre il
progr deve girare su un freebds (credo 4.5, ma cmq immagino 4.x) che non ha
installate le libjpeg e le libgd, non giurerei neanche le libz (le libm
credo di si!), e non so se sono presenti le librerie di compatibilita' per
linux (ma forse, dato che gira apache, sono installata, ma e' solo una mia
deduzione, forse una vaccata)
Se compilo staticamente, il programma segmenta o qualcosa del genere (e'
un cgi-bin che devo installare su un web server di cui non ho un accesso a
livello di shell, quindi non ho l'output esatto, ma solo un generico
Internal Server Error di apache quando lo esegue). questo credo per tutte
le funzioni di i/o che sono differenti da sistema a sistema, credo solo per
questo motivo. dico bene?
Se lo compilo dinamicamente, mancano tutte le lib, quindi non puo' girare.
Come fare?
Si puo' dire al linker che alcune librerie sono da compilare
staticamente, ed altre dinamicamente?
ho provato a linkare con -static, ma mi crea un codice dinamico (??)
ho provato a linkare con -Bstatic, ma non mi trova le librerie (!?) al
momento del linking
L'ideale sarebbe qualche cmd line del tipo
ln -lm -COMPILA_STATICAMENTE_SOLO_LE_SEGUENTI -lgd -ljpeg -lz
(pero' non riesco a specificare in questo modo che le librerie standard
-da cui printf e simili- sono dinamiche, o forse lo fa gia' da se?)
Ho provato anche ad installare un freebsd 4.5 sul mio PC, e li' compilare
tutte le lib che mi servono.
Sono riuscito a compilare il tutto (sempre con gcc -c) ma non riesco a
linkare, non riesce a trovare i riferimenti delle libgd, che cmq ho
compilato ed installato.
Come ne esco senza impazzire?
Gcc puo' trasformarsi in un cross compiler per bsd?
Si puo' linkare in modo mist statico e dinamico?
Perche' il progr compilato su linux non gira sotto bsd? Vuol solo dire che
non sono state installate le librerie di compatibilita' linux sul bsd o ci
puo' essere qualcos'altro sotto?
Ovviamente il mio cgi su linux con apache funziona molto bene. 
ciao e grazie!
Marco
-- 
For direct reply: fritz AT dada DOT it

 deduzione, forse una vaccata)
ti ho già detto che non sono epserto di freebsd. Tuttavia per compilare
staticamente una libreria basta che prendi il suo file.a e lo link
nell'eseguibile.
le varie librerie .a i debian sono incluse nei pacchetti -dev delle
librerie. Quando fai il linking basta che specifichi linkare pure quelle.
fine..
L'esempio te l'ho già postato sul ng del c.
Ciao

per linkare una lib statica:
   gcc -o prog main.c -L/path/lib -llibToInclude -static
per linkare una lib dinamica:
   gcc -o prog main.c -L/path/lib -llibToInclude
dovrebbe essere cosě!
--------------------------------
Inviato via 
http://usenet.libero.it

 dovrebbe essere così!
così fai tutto statico. puoi anche linkare alcune librerie statiche e
altre dinamiche.

 L'esempio te l'ho già postato sul ng del c.
L'esempio in questione, non vedendo il tuo post, non posso vederlo. Potresti
mandarmelo qui, o per mail?
Su i.c.l.c., mi e' stato consigliato di venire qui, quindi non vorrei
proseguire il thread dove forse e' OT
ciao e grazie


 dovrebbe essere così!
e' cosi'.
Ma per mischiare le 2 cose come si fa? 


 altre dinamiche.
ecco, questo e' quello che mi serve.
come si puo' fare?
ciao e grazie


 Ma per mischiare le 2 cose come si fa? 
-Wl,static -llibreria_da_linkare_static, -Wl,dynamic -l
libreria_da_linkare_dynamic
-- 
HappyCactus - Linux User #209744 - 
http://pngstego.sourceforge.net
 
 
www.google.com
 - 
groups.google.com
/* Ci sono 10 categorie di persone al mondo: quelle che capiscono */
/* il sistema binario e quelle che non lo capiscono.              */

 puo' essere qualcos'altro sotto?
Di norma l'eseguibile di un OS non funziona out of the box su un'altro.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! The Moment Is Now In All History, The Time Has Arrived And This Is The
  		One Place To Be. !>- Savatage - This Is The Time

 come si puo' fare?
ma te l'ho già postato dall'altra parte...
comunque: se guardi in debian delle varie librerie ci sono due pacchetti,
uno normale e uno -dev. Bene, se installi il pacchetto -dev trovi la
libreria per il linkink statico, che di solito è un file tipo
/usr/lib/libnome.a
allora prima ti crei i vari moduli oggetto con
gcc -c file1.c -o file1.o
gcc -c file2.c -o file2.o
...
a questo punto devi linkare
gcc file1.o file2.o /usr/lib/libstatica.a -o programa -llibreriadinamica

HappyCactus
Anche se ho risolto il problema, ho cercato nella man page qualche
riferimento al tuo consiglio, e ho trovato un -Wl,option per passare
opzioni al linker. Nella man page di ln non si parla di "static", ma se
ricordo bene nella info page si, quindi faccio tesoro anche di questo.
Morale: tutto ok, grazie ancora a tutti, le avevo provate tutte, compreso
installarmi un freebsd e compilarmi le librerie richieste, ma ancora avevo
problemi a compilare il mio codice. Tutta esperienza che non fa mai male,
ma seguendo il vostro consiglio ho fatto molto prima.
Ho testato l'eseguibile sul freebsd (che non ha installate le librerie che
uso), e funziona benissimo.
Tempo un paio di giorni max e vi posto (curiosita') anche l'url del cgi, che
a mio avviso e' veramente carino: c'e' un form che richiede di inviare
un'immagine (JPG), settare qualche parametro, e restituisce una pagina html
con un mosaico fatto di lettere (da un testo specificabile dall'utente,
cosi' come le dimensioni, il colore di sfondo ecc ecc) ciascuna di un
colore diverso, che viste tutte assieme formano l'immagine inviata. 
Questa e' solo una sfumatura del mio programma (#define CGI_BIN), che nella
versione command line completa (//#define CGI_BIN) fa molto di piu'.
ciao
Marco
__


 versione command line completa (//#define CGI_BIN) fa molto di piu'.
licenza?

 formano l'immagine inviata. Questa e' solo una sfumatura del mio
Tipo questo: 
http://ascii.zelab.net/
HappyCactus che rompe le uova nel paniere! ;)


 licenza?
GPL (magari 2.0, devo leggerla bene), con riserva sul tipo LGPL (devo
informarmi prima)
-- 


 HappyCactus che rompe le uova nel paniere! ;)
cazz.... no, cmq no, il mio intanto usa un fixed font :-P, e discrimina le
forme non in base al carattere, ma in base al colore, infatti fornisce un
output in HTML colorato....
se volete vedere la preview con una immagine fissa, non selezionabile o
upload'bile dall'utente, ma solo dove e' possibile giocare con i parametri:
http://www.webaiuto.it/frontend.htm
(l'immagine e' la solita Lena, storica playmate della computer graphics)
Tempo 2 giorni e si potranno upload'are immagine e lavorare su tutte.
ciao
marco
-- 
