Es ist für mich seltsam, zu verwenden -Wl,-Bstatic
, um festzustellen, mit gcc
welchen Bibliotheken ich statisch verknüpfen möchte. Immerhin erzähle ich gcc
direkt alle anderen Informationen über das Verknüpfen mit Bibliotheken ( -Ldir
, -llibname
).
Kann man dem gcc-Treiber direkt mitteilen, welche Bibliotheken statisch verknüpft werden sollen?
Klarstellung: Ich weiß, dass eine bestimmte Bibliothek, wenn sie nur in statischen Versionen vorhanden ist, ohne sie verwendet wird -Wl,-Bstatic
, aber ich möchte implizieren gcc
, dass die statische Bibliothek bevorzugt wird. Ich weiß auch, dass die direkte Angabe der Bibliotheksdatei mit dieser verknüpft wäre, aber ich bevorzuge es, die Semantik für das Einbeziehen statischer und dynamischer Bibliotheken gleich zu halten.
quelle
-l:
Option dokumentiert? Welche Version von gcc brauche ich, um es zu benutzen?ld
linker sourceware.org/binutils/docs/ld/Options.html "-l namespec
.. Wenn die Namensspezifikation die Form: Dateiname hat, durchsucht ld den Bibliothekspfad nach einer Datei namens Dateiname, andernfalls durchsucht sie die Bibliothek Pfad für eine Datei mit dem Namen libnamespec.a .. .. auf ELF .. -Systemen durchsucht ld ein Verzeichnis nach einer Bibliothek mit dem Namen libnamespec.so, bevor nach einer Bibliothek mit dem Namen libnamespec.a .. gesucht wird. Beachten Sie, dass dieses Verhalten nicht gilt für: Dateiname , die immer eine Datei mit dem Namen Dateiname angibt. ". Seit binutils 2.18 - sourceware.org/binutils/docs-2.18/ld/Options.htmlSie können im Verknüpfungsbefehl eine .a-Datei hinzufügen:
Dies spricht jedoch nicht mit dem gcc-Treiber, sondern mit dem
ld
Linker als Optionen-Wl,anything
.Wenn Sie gcc oder ld mitteilen
-Ldir -lLIBRARY
, überprüft der Linker sowohl statische als auch dynamische Versionen der Bibliothek (Sie können einen Prozess mit sehen-Wl,--verbose
). Um die Reihenfolge der aktivierten Bibliothekstypen zu ändern, können Sie-Wl,-Bstatic
und verwenden-Wl,-Bdynamic
. Hier ist eine Manpage von gnu LD: http://linux.die.net/man/1/ldVerwenden Sie einen solchen gcc-Aufruf, um Ihr Programm dynamisch mit lib1, lib3 und statisch mit lib2 zu verknüpfen:
Angenommen, die Standardeinstellung von ld ist die Verwendung dynamischer Bibliotheken (unter Linux).
quelle
gcc
.gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3
den Trick.-l
und-L
sind auch Linker-Optionen.gcc yourfiles /path/to/library/libLIBRARY.a
oder positiv bewertet-Wl,-Bstatic
?/path/to/library/libLIBRARY.a
benötigt den vollständigen Pfad zum Schreiben, Variante 2-Wl,-Bstatic -llib2 -Wl,-Bdynamic
ist nur lang und fügt 2 zusätzliche Optionen hinzu und nimmt den Standardmodus als Bdynamic an. Die akzeptierte Variante 3-l:libXYZ.a
ist kurz und funktioniert einfach. Alle drei funktionieren in vielen Fällen, und Variante 2 funktioniert möglicherweise nicht, wenn statische Programme verknüpft werden. Der tatsächliche Verknüpfungsschritt für die Bibliothek ist in allen Varianten gleich, wie ich verstehe.