2010-09-13 14 views
46

Ho un programma che collega a molte librerie. g++, per impostazione predefinita, preferisce collegarsi a librerie condivise, anche se esiste l'archivio corrispondente.linker g ++: forza il collegamento statico se esiste una libreria statica?

Come posso modificare questa preferenza per preferire archivi statici su librerie dinamiche, se esiste un archivio statico?

Nota, ho usato l'opzione -static, ma tenta di trovare l'archivio statico per tutte le librerie che non è quello che voglio.

+0

Vedere anche: http://stackoverflow.com/questions/4500158/how-can-i-force-linking-with-a-static-library-when-a-shared-library-of-same-name – Antonio

risposta

62
g++ -Wl,-Bstatic -lz -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed 

collegherà zlib e libfoo come statica, e libbar dinamico. --as-needed interromperà qualsiasi libreria dinamica non utilizzata.

5

Quando si desidera collegare staticamente una o due librerie con il resto, incluse le librerie di sistema, essendo dinamiche, è spesso più semplice fare semplicemente riferimento alla libreria statica con il suo nome completo. Cioè piuttosto che utilizzare -l e -L per ottenere g ++ per risolvere una libreria da quello che trova, è possibile aggiungere il percorso completo alla libreria come input. Prendendo il g ++ comando precedente, collegare un programma principale main.o applicazione libz statica e dinamica libfoo e libbar e libglib ecc:

`` ` g ++ main.o /usr/lib/libz.a/usr/lib /libfoo.a -lbar

Edit 3 17 agosto: ho appena scattato attraverso this answer che va più in dettaglio e offre un modo alternativo (-l:) per specificare direttamente la libreria.

Problemi correlati