2010-09-13 16 views
46

Ich habe ein Programm, das zu vielen Bibliotheken verbindet. g++, bevorzugt die Verknüpfung mit gemeinsam genutzten Bibliotheken, auch wenn das entsprechende Archiv vorhanden ist.g ++ Linker: erzwinge statische Verknüpfung, wenn eine statische Bibliothek existiert?

Wie kann ich diese Einstellung ändern, um statische Archive gegenüber dynamischen Bibliotheken zu bevorzugen, wenn ein statisches Archiv existiert?

Hinweis, ich habe -static Option verwendet, aber es versucht, statisches Archiv für alle Bibliotheken zu finden, die nicht das ist, was ich will.

+0

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

Antwort

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

verbinden wird zlib und libfoo als statisch und libbar als dynamisch. --as-needed löscht jede nicht verwendete dynamische Bibliothek.

5

Wenn Sie nur eine oder zwei Bibliotheken statisch mit dem Rest verknüpfen möchten, einschließlich Systembibliotheken, ist es oft einfacher, einfach auf die statische Bibliothek mit ihrem vollständigen Namen zu verweisen. I.e. Anstatt -l und -L zu verwenden, um g ++ zu erhalten, um eine Bibliothek von dem, was es findet, zu lösen, fügen Sie einfach den vollständigen Pfad zur Bibliothek als Eingabe hinzu. Unter der g ++ obigen Befehl, zu verknüpfen, um eine Anwendung main.o Hauptprogramm auf statische libz und libfoo und dynamische libbar und libglib usw.:

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

bearbeiten 3 17 Aug: ich habe gerade über this answer ausgelöst, die mehr ins Detail geht und bietet eine alternative Art und Weise (-l:) direkt die Bibliothek angeben.

Verwandte Themen