Antworten:
Beziehen auf:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
Sie benötigen die statische Version der Bibliothek, um sie zu verknüpfen.
Eine gemeinsam genutzte Bibliothek ist eine ausführbare Datei in einem speziellen Format mit angegebenen Einstiegspunkten (und einigen Problemen bei der Adressierung). Es verfügt nicht über alle Informationen, die für eine statische Verknüpfung erforderlich sind.
Sie können eine gemeinsam genutzte Bibliothek nicht statisch verknüpfen (oder eine statische Bibliothek dynamisch verknüpfen).
Das Flag -static
zwingt den Linker, statische Bibliotheken (.a) anstelle von gemeinsam genutzten (.so) zu verwenden. Da statische Bibliotheken jedoch nicht immer standardmäßig installiert sind, müssen Sie die statische Bibliothek möglicherweise selbst installieren.
Ein anderer möglicher Ansatz ist die Verwendung von Statifier oder Hermelin . Beide Tools verwenden als Eingabe eine dynamisch verknüpfte ausführbare Datei und erstellen als Ausgabe eine in sich geschlossene ausführbare Datei, in die alle gemeinsam genutzten Bibliotheken eingebettet sind.
Wenn Sie beispielsweise libapplejuice statisch verknüpfen möchten , aber nicht liborangejuice , können Sie Folgendes verknüpfen:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
Es gibt eine Einschränkung - wenn liborangejuice
verwendet libapplejuice
, libapplejuice
wird auch dynamisch verknüpft.
Sie müssen liborangejuice
statisch mit verknüpfen libapplejuice
, um libapplejuice
statisch zu werden.
Und vergessen -Wl,-Bdynamic
Sie nicht , alles zu behalten, sonst verknüpfen Sie am Ende alles Statische, einschließlich libc
(was nicht gut ist).
gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libB verwendet libA , ist verknüpft und ldd
zeigt keinen Verweis auf libA an . Die ausführbare Datei funktioniert einwandfrei. Getestet mit g ++ 4.7.3.
Wenn Sie die .a-Datei Ihrer gemeinsam genutzten Bibliothek (.so) haben, können Sie sie einfach in ihren vollständigen Pfad einfügen, als wäre es eine Objektdatei, wie folgt:
Dies erzeugt main.o durch einfaches Kompilieren:
gcc -c main.c
Dadurch wird diese Objektdatei mit der entsprechenden statischen Bibliothek verknüpft und die ausführbare Datei (mit dem Namen "main") erstellt:
gcc main.o mylibrary.a -o main
Oder in einem einzigen Befehl:
gcc main.c mylibrary.a -o main
Es könnte auch ein absoluter oder relativer Pfad sein:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
Ja, ich weiß, dass dies eine 8 Jahre alte Frage ist, aber mir wurde gesagt, dass es möglich ist, eine statische Verknüpfung mit einer Bibliothek mit gemeinsam genutzten Objekten herzustellen, und dies war buchstäblich der Top-Hit, als ich nach weiteren Informationen darüber suchte.
Verwenden Sie den folgenden Befehl, um zu demonstrieren, dass das statische Verknüpfen einer Bibliothek mit gemeinsam genutzten Objekten mit ld
( gcc
's Linker) nicht möglich ist - im Gegensatz zu nur einer Gruppe von Personen, die darauf bestehen, dass dies nicht möglich ist gcc
:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Natürlich müssen Sie objectname.o
aus kompilieren sourcename.c
, und Sie sollten wahrscheinlich auch Ihre eigene Bibliothek für gemeinsam genutzte Objekte erstellen . Wenn Sie dies tun, verwenden Sie -Wl,--library-path,.
diese Option , damit ld Ihre Bibliothek im lokalen Verzeichnis finden kann.)
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 ich dachte, er könnte für euch nützlich sein:
CDE: Erstellen Sie automatisch tragbare Linux-Anwendungen
http://www.pgbovine.net/cde.html
Führen Sie die Binärdatei aus, indem Sie als Argument den Namen der Binärdatei übergeben, die portabel gemacht werden soll, z. B. 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 namens cde-package / (in demselben Verzeichnis wie Sie).
Denken Sie daran, um das tragbare Programm zu starten, müssen Sie die Binärdatei in cde-package / nmap.cde ausführen
Freundliche Grüße