GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Statischer Link der gemeinsam genutzten Bibliotheksfunktion in gcc

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.


Linux
  1. Linux – Systemweite Überwachung von Aufrufen einer Bibliotheksfunktion?

  2. Geteilte Libsdl-Bibliothek lässt sich nicht öffnen?

  3. Einführung in gemeinsam genutzte Linux-Bibliotheken (So erstellen Sie gemeinsam genutzte Bibliotheken)

  4. Dynamische Shared Library-Kompilierung mit g++

  5. Konvertieren Sie eine statische Bibliothek in eine gemeinsam genutzte Bibliothek?

C++ Dynamic Shared Library unter Linux

Was bedeutet Warnung:Das Verknüpfen der gemeinsam genutzten Bibliothek mit der statischen Bibliothek ist nicht portierbar?

Unterschied zwischen gemeinsam genutzten Objekten (.so), statischen Bibliotheken (.a) und DLLs (.so)?

Wie kann eine gemeinsam genutzte Bibliothek (.so) eine Funktion aufrufen, die in ihrem Ladeprogramm implementiert ist?

Wie kann ich eine Verknüpfung zu einer älteren Version einer gemeinsam genutzten Bibliothek herstellen?

Rufen Sie Funktionsnamen in einer gemeinsam genutzten Bibliothek programmgesteuert ab