2013-02-15 24 views
15

Ho un problema nella creazione di una libreria condivisa con GCC/Linux. Attualmente questa libreria condivisa è creata con l'opzione GCC/libtool "-shared" e tutto va bene.Collega una libreria statica a una condivisa durante la compilazione?

Ora ci sono due librerie statiche aggiuntive (.a-file) che devono essere aggiunte a questa condivisa poiché forniscono alcune funzionalità richieste da quella condivisa. L'aggiunta di queste librerie statiche con l'opzione "-l" non aiuta, in seguito non fanno parte del file .so.

Quindi, come posso forzare GCC/libtool per aggiungere realmente il codice di queste librerie statiche alla libreria condivisa?

Grazie!

+0

Per la creazione di file eseguibili si può semplicemente aggiungere il percorso completo della libreria statica per le opzioni di costruzione di gcc, come ad esempio: 'gcc -Wall -g live_mystuff.c -o my_app /usr/local/src/ffmpeg/libswscale/libswscale.a -lpthread -lbz2 -lm -lz -lfaac -lmp3lame -lx264 -lfaad ...' potrebbe funzionare anche per la creazione di librerie condivise. Provalo. – fritzone

+0

Come sai che "non fanno parte del file .so"? –

+0

@fritzone: per gli eseguibili che funzionano senza problemi, devo farlo per una libreria condivisa – Elmi

risposta

21

È necessario l'opzione di collegamento --whole-archive in questo caso per comandare al linker di includere il contenuto di tutte le librerie statiche nella lib condivisa.

g++ -shared sample.o -o libSample.so -Wl,-whole-archive -lmylib1.a -lmylib2.a -Wl,-no-whole-archive 

Da man ld:

Per ogni archivio menzionato sulla riga di comando dopo l'opzione --whole-archivio, comprendono tutti i file oggetto nell'archivio nel link, piuttosto che la ricerca sul archivio per i file oggetto richiesti. Questo è normalmente usato per trasformare un file di archivio in una libreria condivisa, forzando ogni oggetto ad essere incluso nella libreria condivisa risultante. Questa opzione può essere utilizzata più di una volta.

Due note quando si utilizza questa opzione da gcc: in primo luogo, gcc non conosce questa opzione, quindi è necessario utilizzare -Wl, -whole-archive. In secondo luogo, non dimenticare di usare -Wl, -no-whole-archive dopo il tuo elenco di archivi, perché gcc aggiungerà il proprio elenco di archivi al tuo link e potresti non volere che questo flag influenzi anche quelli.

+0

su SunOS Ho dovuto usare i trattini bot dopo '-WL,'. – stefanct

2

è necessario solo il parametro --whole-archivio-forza al linker di includere la libreria, ma dovrebbe essere in grado di dedurre le proprie esigenze da simboli senza eguali.

garantire che eventuali librerie statiche sulla riga di comando vengono dopo i loro oggetti-file dipendenti Es:

g++ -Wl,-E -g -pipe -O2 -pipe -fPIC myobjectfile.o mystaticlibrary.a -shared -o mylib.so 
Problemi correlati