2010-04-15 21 views
26

Sotto gcc (g ++), ho compilato una libreria statica some_static_lib.a (denominata some_static_lib.a). Voglio collegare (è quella la frase giusta?) Questo file .a in un'altra libreria dinamica (chiamiamolo libsomeDyn.so) che sto costruendo. Anche se il .so compila, non vedo contenuto di .a sotto .so usando nm comando:come collegare la libreria statica alla libreria dinamica in gcc

/usr/bin/g ++ -fPIC -g -Wall -O2 -pipe -Werror -march = pentium3 -mtune = prescott -MD -D_FILE_OFFSET_BITS = 64 -DLINUX -D_GNU_SOURCE -D_THREAD_SAFE -I ../../../../../../../../ -I ../../ .. /../../../../..//libraries -Wl, -rpath,/usr/lib -o libsomeDyn.so some.o another.o some_static_lib.a -shared -Wl -x - Wl, -soname, libsomeDyn.so

Non vedo le funzioni in some_static_lib.a in libsomeDyn.so. Che cosa sto facendo di sbagliato?

risposta

33

Le librerie statiche hanno regole speciali per il collegamento. Un oggetto dalla libreria statica verrà aggiunto al file binario solo se l'oggetto fornisce un simbolo non risolto.

Su Linux, è possibile modificare questo comportamento con l'opzione --whole-archive linker:

g++ -Wl,--whole-archive some_static_lib.a -Wl,--no-whole-archive 
+0

Quindi ho qualche strana dipendenza nella libreria statica. Fa riferimento a una funzione inclusa nella libreria dinamica. Come posso dire a gcc di trovare il riferimento non definito all'interno della libreria dinamica? Grazie – bob

+0

@bob - non ci dovrebbero essere problemi con la libreria statica riferimento a un simbolo all'interno della libreria dinamica (una volta che si collega una libreria statica, è solo lo stesso come se si fa riferimento direttamente al .o sulla riga di comando). Sospetto che ci sia qualche altro problema e consiglio di pubblicare una nuova domanda. –

+0

Per me è stata la soluzione, ma su OSX ho dovuto usare '-all_load' come equivalente a' --whole-archive' come qualcuno mi ha suggerito su IRC. Spero che possa aiutare qualcun altro! – vmonteco

14

Per tutti quelli che si imbatte il problema come me (e non ha capire la risposta corretta): ecco un breve howto generare una libreria dinamica (libmylib.so) da uno statico (mylib.a):

1.) creare un file mylib.c che importa solo il file mylib.h

2.) compilare questo mylib da .c a mylib.o con

gcc -c -fPIC mylib.c -o msat.o 

3.) generare una libreria dinamica con il seguente comando:

gcc --whole-archive -shared -Wl,-soname,libmylib.so -o libmylib.so mylib.o mylib.a 

che ha lavorato almeno per me, trasformando una libreria statica (compilato con -fPIC) per una libreria dinamica. Non sono sicuro che questo funzioni per altre librerie.

+2

il passo 2 dovrebbe dire "mylib.o" anziché "msat.o"? – mwag

+0

Non l'ho provato, ma l'idea di base è probabilmente OK. Tecnicamente, --whole-archive è un'opzione linker (gcc non lo capirà se lo passi come "gcc --whole-archive"). Invece dovrebbe essere spostato passato "-Wl", per esempio: gcc -shared -Wl, - tutto-archivio, -soname, libmylib.so ... vorrei modificare la risposta, ma non ho modo di verificare se lavori. Nella forma attuale, porterà ad un errore di gcc ("non riconosciuta l'opzione da riga di comando‘--whole-archivio’"). –

+0

Anche -Wl, - intero-archivio ...-Wl, - il blocco no-whole-archive dovrebbe essere intorno alla libreria statica (mylib.a). Come nella risposta accettata. –

Problemi correlati