Siehe:
http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/
Sie benötigen die statische Version der Bibliothek, um sie zu verknüpfen.
Eine gemeinsam genutzte Bibliothek ist eigentlich eine ausführbare Datei in einem speziellen Format mit festgelegten Einstiegspunkten (und einigen Problematiken bei der Adressierung). Es enthält nicht 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 dynamisch verknüpfen).
Das Flag -static
zwingt den Linker, statische Bibliotheken (.a) anstelle von gemeinsam genutzten (.so) zu verwenden. Aber statische Bibliotheken werden nicht immer standardmäßig installiert, daher müssen Sie die statische Bibliothek möglicherweise selbst installieren.
Ein weiterer 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 eigenständige ausführbare Datei, in die alle gemeinsam genutzten Bibliotheken eingebettet sind.
Wenn Sie die .a-Datei Ihrer gemeinsam genutzten Bibliothek (.so) haben, können Sie sie einfach mit ihrem vollständigen Pfad einschließen, als wäre es eine Objektdatei, wie hier:
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
Wenn Sie verlinken möchten, sagen Sie libapplejuice statisch, aber nicht, sagen wir, 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
verwendet libapplejuice
, dann libapplejuice
werden ebenfalls dynamisch verlinkt.
Sie müssen liborangejuice
verlinken statisch neben libapplejuice
um libapplejuice
zu erhalten statisch.
Und vergessen Sie nicht, -Wl,-Bdynamic
beizubehalten Andernfalls verlinken Sie am Ende alles statisch, einschließlich libc
(was nicht gut ist).
Ja, ich weiß, dass dies eine 8 Jahre alte Frage ist, aber mir wurde gesagt, dass es möglich sei, statisch mit einer gemeinsam genutzten Objektbibliothek zu verknüpfen, und dies war buchstäblich der Top-Treffer, als ich nach weiteren Informationen darüber suchte.
Um tatsächlich zu demonstrieren, dass das statische Linken einer Shared-Object-Bibliothek mit ld
nicht möglich ist (gcc
's-Linker) -- im Gegensatz zu einigen Leuten, die darauf bestehen, dass dies nicht möglich ist -- verwenden Sie den folgenden gcc
Befehl:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Natürlich müssen Sie objectname.o
kompilieren ab sourcename.c
, und Sie sollten wahrscheinlich auch Ihre eigene Shared-Object-Bibliothek erstellen. Verwenden Sie in diesem Fall -Wl,--library-path,.
damit ld Ihre Bibliothek im lokalen Verzeichnis finden kann.)
Der eigentliche Fehler, den Sie erhalten, ist:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
Hoffe das hilft.