Kann ich beim Linken statische und gemeinsam genutzte Objektbibliotheken mischen?

Lesezeit: 1 Minute

Ich habe ein C-Projekt, das zehn ausführbare Dateien produziert, die ich alle statisch einbinden möchte. Das Problem, mit dem ich konfrontiert bin, ist, dass eine dieser ausführbaren Dateien eine Bibliothek eines Drittanbieters verwendet, von der nur die Shared-Object-Version verfügbar ist.

Wenn ich die bestehe -static Flag zu gcc, ld wird die Fehlermeldung geben, dass die betreffende Bibliothek nicht gefunden werden kann (ich nehme an, sie sucht nach der .a-Version) und die ausführbare Datei wird nicht erstellt. Idealerweise möchte ich in der Lage sein, ‘ld’ anzuweisen, so viel wie möglich statisch zu verknüpfen und auf die gemeinsam genutzte Objektbibliothek umzuschalten, wenn keine statische Bibliothek gefunden werden kann.

Im Interium habe ich sowas probiert gcc -static -lib1 -lib2 -shared -lib3rdparty foo.c -o foo.exe in der Hoffnung, dass ‘ld’ lib1 und lib2 statisch verknüpfen würde, aber nur eine Laufzeitabhängigkeit von lib3rdparty hat. Leider hat dies nicht so funktioniert, wie ich es beabsichtigt hatte; stattdessen die -shared Flag hat die überschrieben -static flag und alles wurde als Shared-Objects kompiliert.

Ist die statische Verknüpfung ein Alles-oder-Nichts-Deal oder gibt es eine Möglichkeit, sie zu kombinieren?

Benutzeravatar von Anthony
Antonius

Anschauen dieser Faden Sie können sehen, dass es getan werden kann. Die Jungs von GNU schlagen vor

gcc foo.c -Wl,-Bstatic -lbar -lbaz -lqux -Wl,-Bdynamic -lcorge -o foo.exe

  • Fehlt ein Präfix “-l” in der Liste der Bibliotheken nach “-Wl,-Bstatic ; sollte es heißen: -Wl,-Bstatic -llib2 -llib2 -llib3 ???

    – Heston T. Holtmann

    17. März 2014 um 21:18 Uhr


  • @HestonT.Holtmann Es ist impliziert, aber ich werde es reparieren, damit es klarer ist.

    – Antonius

    18. März 2014 um 0:23 Uhr

  • @Anthony Wie macht man dasselbe mit LDFLAGS?

    – spritzig

    26. Juni 2018 um 7:37 Uhr

1411760cookie-checkKann ich beim Linken statische und gemeinsam genutzte Objektbibliotheken mischen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy