Wie kann ich eine gemeinsam genutzte Bibliotheksfunktion in gcc statisch verknüpfen?
Beziehen auf:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
Zum Verknüpfen benötigen Sie eine statische Version der Bibliothek.
Eine gemeinsam genutzte Bibliothek ist eine ausführbare Datei in einem speziellen Format mit festgelegten Einstiegspunkten (und einigen Problemen bei der Adressierung). Es sind nicht alle Informationen vorhanden, die für eine statische Verknüpfung erforderlich sind.
Sie können eine gemeinsam genutzte Bibliothek nicht statisch verknüpfen (oder statisch dynamisch verknüpfen)
Mit Flag -static wird der Linker gezwungen, die statische Bibliothek (.a) anstelle der freigegebenen (.so) zu verwenden. Statische Bibliotheken werden nicht immer standardmäßig installiert. Wenn Sie also einen statischen Link benötigen, müssen Sie statische Bibliotheken installieren.
Ein anderer möglicher Ansatz ist die Verwendung von Statifikator oder Ermine . Beide Tools verwenden als Eingabe dynamisch verknüpfte ausführbare Dateien und erstellen als Ausgabe eigenständige ausführbare Dateien, in die alle gemeinsam genutzten Bibliotheken eingebettet sind.
Wenn Sie verlinken möchten, sagen Sie libapplejuice statisch, aber nicht liborangejuice, können Sie wie folgt verlinken:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
Es gibt eine Einschränkung - wenn liborangejuice
libapplejuice
verwendet, wird libapplejuice
ebenfalls dynamisch verknüpft.
Sie müssen liborangejuice
neben libapplejuice
statisch verknüpfen, um libapplejuice
statisch zu erhalten.
Und vergiss nicht, -Wl,-Bdynamic
andernfalls werden Sie am Ende alles Statische verknüpfen, einschließlich libc
(was nicht gut ist).
Wenn Sie die .a-Datei Ihrer gemeinsam genutzten Bibliothek (.so) haben, können Sie sie einfach mit ihrem vollständigen Pfad einfügen, als ob es sich um eine Objektdatei handeln würde:
Dies erzeugt main.o durch einfaches Kompilieren von:
gcc -c main.c
Diese verknüpft die Objektdatei mit der entsprechenden statischen Bibliothek und erstellt die ausführbare Datei (mit dem Namen "main"):
gcc main.o mylibrary.a -o main
Oder in einem einzigen Befehl:
gcc main.c mylibrary.a -o main
Es kann sich auch um einen absoluten oder relativen Pfad handeln:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
Ja, ich weiß, dass dies eine 8-jährige Frage ist, aber mir wurde gesagt, dass es möglich ist, statische Verknüpfungen mit einer gemeinsam genutzten Objektbibliothek herzustellen, und dies war buchstäblich der Hit, als ich nach weiteren Informationen darüber suchte.
Um zu demonstrieren, dass das statische Verknüpfen einer gemeinsam genutzten Objektbibliothek mit dem Linker von ld
(gcc
) nicht möglich ist - im Gegensatz zu nur einigen Personen, die darauf bestehen, dass dies nicht möglich ist - verwenden Sie Folgendes gcc
Befehl:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Natürlich müssen Sie objectname.o
Aus sourcename.c
Kompilieren, und Sie sollten wahrscheinlich auch Ihre eigene Shared-Object-Bibliothek erstellen. Wenn Sie dies tun, verwenden Sie -Wl,--library-path,.
, Damit ld Ihre Bibliothek im lokalen Verzeichnis findet.)
Der tatsächliche Fehler, den Sie erhalten, ist:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
Hoffentlich hilft das.
Ein bisschen spät, aber ... Ich habe einen Link gefunden, den ich vor ein paar Jahren gespeichert habe, und dachte, er könnte für euch nützlich sein:
CDE: Tragbare Linux-Anwendungen automatisch erstellen
http://www.pgbovine.net/cde.html
Führen Sie die binäre Übergabe als Argument des Namens der Binärdatei aus, die Sie portabel machen möchten, zum Beispiel: nmap
./cde_2011-08-15_64bit nmap
Das Programm liest alle mit nmap und seinen Abhängigkeiten verknüpften Bibliotheken und speichert sie alle in einem Ordner mit dem Namen cde-package/ (im selben Ordner) Verzeichnis, das Sie sind).
Denken Sie daran, um das tragbare Programm zu starten, müssen Sie die Binärdatei ausführen, die sich in cde-package/nmap.cde befindet.
Freundliche Grüße
In gcc wird dies nicht unterstützt. Tatsächlich wird dies von keinem mir bekannten Compiler/Linker unterstützt.