Beim Kompilieren unseres Projekts erstellen wir mehrere Archive (statische Bibliotheken), sagen wir liby.a
und libz.a
, die jeweils eine Objektdatei enthalten, die eine Funktion y_function()
und z_function()
definiert. Dann sind diese Archive in einem gemeinsamen Objekt verbunden, sagen wir libyz.so
, das ist eines unserer wichtigsten verteilbaren Ziel.Wie alle Objekte eines Archivs in einem gemeinsamen Objekt enthalten?
g++ -fPIC -c -o y.o y.cpp
ar cr liby.a y.o
g++ -fPIC -c -o z.o z.cpp
ar cr libz.a z.o
g++ -shared -L. -ly -lz -o libyz.so
Wenn dieses gemeinsame Objekt in dem Beispiel-Programm, sagen x.c
, schlägt die Verbindung wegen eines undefinierten Verweise auf Funktionen y_function()
und z_function()
.
g++ x.o -L. -lyz -o xyz
Es funktioniert aber, wenn ich die endgültige ausführbare direkte Verknüpfung mit den Archiven (statische Bibliotheken).
g++ x.o -L. -ly -lz -o xyz
Meine Vermutung ist, dass die Objektdateien in den Archiven enthalten sind, nicht in der gemeinsam genutzten Bibliothek verknüpft, weil sie in ihm nicht verwendet werden. Wie man Einschluss erzwingt
Edit:
Aufnahme kann --whole-Archiv ld
Option gezwungen werden. Aber wenn die Ergebnisse in Kompilierungsfehlern:
g++ -shared '-Wl,--whole-archive' -L. -ly -lz -o libyz.so
/usr/lib/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0x1d): undefined reference to `__init_array_end'
/usr/bin/ld: /usr/lib/libc_nonshared.a(elf-init.oS): relocation R_X86_64_PC32 against undefined hidden symbol `__init_array_end' can not be used when making a shared object
/usr/bin/ld: final link failed: Bad value
Jede Idee, wo das herkommt?
Danke, das sieht aus wie das, was ich suche, aber es erzeugt einen Link-Fehler Ich kann nicht herausfinden, woher es kommt. Ich fügte Details in die Frage ein. –
Für diese Option gibt es eine Importnot in 'man ld': Vergessen Sie nicht, -Wl, -no-whole-archive nach Ihrer Liste von Archiven zu verwenden, da gcc eine eigene Liste von Archiven zu Ihrem Link hinzufügen wird und Sie nicht möchte, dass diese Flagge auch diese beeinflusst –