Gcc direkt anweisen, eine Bibliothek statisch zu verknüpfen

133

Es ist für mich seltsam, zu verwenden -Wl,-Bstatic, um festzustellen, mit gccwelchen Bibliotheken ich statisch verknüpfen möchte. Immerhin erzähle ich gccdirekt 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.

Elazar Leibovich
quelle

Antworten:

188

Es ist natürlich möglich, -l:statt zu verwenden -l. Zum Beispiel -l:libXYZ.azum Verknüpfen mit libXYZ.a. Beachten Sie die libausgeschriebenen, im Gegensatz zu -lXYZdenen automatisch zu erweitern würde libXYZ.

Radek
quelle
62
Gott, wenn nur Gnu dies in erster Linie zum Standard gemacht hätte, anstelle des lib-Präfix-Wahnsinns. Oh, die Zeit und die Frustration, die wir gespart hätten.
Timmmm
9
Radek, ist diese -l:Option dokumentiert? Welche Version von gcc brauche ich, um es zu benutzen?
Osgx
18
Tatsächlich ist es eine Option von ldlinker 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.html
osgx
17
GNU ist nirgends für diese Schnittstelle verantwortlich, sie wurde von der Unix-Toolchain geerbt.
Akim
Es ist eine verdammte Schande, dass dies in Nicht-GNU-Linkern nicht funktioniert. Es ist eine gute Möglichkeit, LDLIBS und ähnliche Konfigurationsoptionen zu "erzwingen", um statische Bibliotheken ohne seltsame Problemumgehungen für Link-Flags zu finden.
Nneonneo
130

Sie können im Verknüpfungsbefehl eine .a-Datei hinzufügen:

  gcc yourfiles /path/to/library/libLIBRARY.a

Dies spricht jedoch nicht mit dem gcc-Treiber, sondern mit dem ldLinker 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,-Bstaticund verwenden -Wl,-Bdynamic. Hier ist eine Manpage von gnu LD: http://linux.die.net/man/1/ld

Verwenden Sie einen solchen gcc-Aufruf, um Ihr Programm dynamisch mit lib1, lib3 und statisch mit lib2 zu verknüpfen:

gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3

Angenommen, die Standardeinstellung von ld ist die Verwendung dynamischer Bibliotheken (unter Linux).

osgx
quelle
3
Kurzfassung: Mit dem Strom geht das nicht gcc.
Elazar Leibovich
7
Elazar Leibovich, macht aber gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3den Trick.
Osgx
13
Das Verknüpfen (und Suchen von dyn / static libs) erfolgt über den Linker. Sie müssen also die Linker-Optionen verwenden. -lund -Lsind auch Linker-Optionen.
Osgx
3
Wird diese Antwort wegen gcc yourfiles /path/to/library/libLIBRARY.aoder positiv bewertet -Wl,-Bstatic?
Tor Klingberg
7
@TorKlingberg, Variante 1 /path/to/library/libLIBRARY.abenötigt den vollständigen Pfad zum Schreiben, Variante 2 -Wl,-Bstatic -llib2 -Wl,-Bdynamicist nur lang und fügt 2 zusätzliche Optionen hinzu und nimmt den Standardmodus als Bdynamic an. Die akzeptierte Variante 3 -l:libXYZ.aist 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.
Osgx