Wie füge ich alle Objekte eines Archivs in ein gemeinsames Objekt ein?

Wenn wir unser Projekt kompilieren, erstellen wir mehrere Archive (statische Bibliotheken), sagen wirliby.a undlibz.a dass jede eine Objektdatei enthält, die eine Funktion definierty_function() undz_function(). Diese Archive werden dann zu einem gemeinsam genutzten Objekt zusammengefügt, z. B.libyz.so, das ist eines unserer wichtigsten verteilbaren Ziele.

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 Sie dieses gemeinsam genutzte Objekt im Beispielprogramm verwenden, sagen Siex.c, der Link schlägt fehl, da nicht definierte Verweise auf Funktioneny_function() undz_function().

g++ x.o -L. -lyz -o xyz

Es funktioniert jedoch, wenn ich die endgültige ausführbare Datei direkt mit den Archiven (statischen Bibliotheken) verknüpfe.

g++ x.o -L. -ly -lz -o xyz

Meine Vermutung ist, dass die in den Archiven enthaltenen Objektdateien nicht @ sin linked in die gemeinsam genutzte Bibliothek, da sie dort nicht verwendet werden. Wie wird die Inklusion erzwungen?

Bearbeiten

Inclusion kann mit --whole-archive @ erzwungen werdld Möglichkeit. Aber wenn es zu Kompilierungsfehlern kommt:

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

Hast du eine Idee, woher das kommt?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage