Verwenden Sie sowohl statische als auch dynamische Bibliotheken in gcc verbunden

StackOverflow https://stackoverflow.com/questions/809794

  •  03-07-2019
  •  | 
  •  

Frage

Ich brauche eine binäre zu verteilen, die auf so viele x86-Linux-Distributionen wie möglich ausgeführt werden. Das bedeutet, dass ich muß statisch einige Bibliotheken verknüpfen, wie glibc, da der Benutzer nicht die Version haben könnte ich verwenden. Andere Bibliotheken dynamisch gelinkt, wie fontconfig werden, weil es auf ein Cache-Dateiformat setzt und hart codierte Orte, die auf jedem System unterscheiden können.

Was sind die Befehlszeilenoptionen, dies zu tun? Wenn ich -static angeben, dann wird gcc verweigern dynamisch überhaupt alle Bibliotheken zu verbinden.

War es hilfreich?

Lösung

Statisch Verknüpfung gegen jede Systembibliothek und vor allem gegen libc, auf modernen UNIX oder Linux-Systeme macht die binäre deutlich weniger tragbar. Es einfach nicht tun.

Verwenden Sie stattdessen die Abwärtskompatibilität (Binärdateien auf einem älteren System verknüpft weiterhin auf allen neueren laufen) zu Ihrem Vorteil, entweder durch die Binärdatei auf einem alten System verbindet (ich benutze RedHat 6.2, und ich habe nicht ein Linux-System gesehen wo mein Binärdatei wird nicht in den letzten 8 Jahren läuft) oder durch so etwas wie Autopackage (die gelöscht wurde, nachdem diese Antwort geschrieben wurde).

Ihre ursprüngliche Frage zu beantworten:

gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic

wird Linker verursacht Archivversion von libfoo zu verwenden. [Es ist wichtig, den nachgestellten -Wl,-Bdynamic genau zu haben, so dass Sie nicht statisch libc zwingen Sie.]

Andere Tipps

Es ist zu beachten, dass unter Linux können Sie nur (sicher) statisch eine Bibliothek verknüpfen, wenn keine der dynamischen Bibliotheken davon abhängen. Dies bedeutet, dass, wenn Sie irgendwelche dynamischen Bibliotheken verwenden überhaupt, können Sie statisch vergessen Verknüpfung libc. Verwenden Sie einfach eine ziemlich alte Version gegen den Fall für libc zu bauen; libc wurde beibehalten starke ABI rückwärts Kompatiblität im Laufe der Jahre.

Versuchen Sie, in den Pfaden zu den Bibliotheksdateien vorbei Sie eine Verknüpfung gegen auf der Linker-Befehlszeile (seien sie .a oder .so Bibliotheken) und Drop -static. Das sollte den Trick tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top