2010-05-04 8 views
13

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?

Antwort

18

Sie könnten versuchen, (ld (2)):

--whole-archive 
     For each archive mentioned on the command line after the --whole-archive option, include every object file in the 
     archive in the link, rather than searching the archive for the required object files. This is normally used to turn 
     an archive file into a shared library, forcing every object to be included in the resulting shared library. This 
     option may be used more than once. 

(gcc -Wl, - Ganzkörper-Archiv)

Plus sollten Sie -Wl,--no-whole-archive am Ende der Bibliotheksliste setzen. (wie von Dmitry Yudakov im Kommentar unten gesagt)

+0

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. –

+2

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 –

Verwandte Themen