2011-10-28 6 views
14

Sto compilando alcuni oggetti condivisi file in un archive.a:Collegamento archivi (.a) in oggetto condiviso (.so)

$ g++ -c -Iinclude/ -fPIC -O0 -o object1.o source1.cpp 
$ g++ -c -Iinclude/ -fPIC -O0 -o object2.o source2.cpp 
$ ar rvs archive.a object1.o object2.o 
r - object1.o 
r - object2.o 

Fin qui tutto bene. Lo archive.a risultante ha una buona dimensione di alcuni KB. Un dump con nm mostra che i file oggetto corrispondenti sono contenuti nei file.

Ora sto cercando di compilare molti di questi archivi in ​​un file oggetto condiviso.

g++ -g -O0 -Iinclude/ -I/usr/include/somelibrary -shared -o libLibrary.so archive1.a archive2.a 

Il risultato è che il mio file di libreria risultante è quasi vuota :

$ nm -D libLibrary.so 
       w _Jv_RegisterClasses 
0000000000201010 A __bss_start 
       w __cxa_finalize 
       w __gmon_start__ 
0000000000201010 A _edata 
0000000000201020 A _end 
0000000000000578 T _fini 
0000000000000430 T _init 

Qualsiasi idea di cosa sto facendo male?


Edit:

Quando provo l'interruttore -Wl,--whole-archive, accade quanto segue:

/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init': 
(.text+0xd): undefined reference to `__init_array_end' 
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/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 
collect2: ld returned 1 exit status 
make: *** [libKeynect.so] Error 1 
+0

possibile duplicato di [Come includere tutti gli oggetti di un archivio in un oggetto condiviso?] (Http://stackoverflow.com/questions/2763988/how-to-include-all-objects-of-an-archive- in-a-shared-object) – Atmocreations

risposta

15

simboli/file oggetto in .a file che non è abituato, saranno scartati dal linker .

Usa -Wl,--whole-archive per il collegamento di includere l'intero file .a Edit, è necessario aggiungere -Wl,--no-whole-archive dopo aver specificato la libreria e, in modo del tutto sarà -Wl,--whole-archive archive1.a archive2.a -Wl,--no-whole-archive

+0

Grazie per la risposta veloce. Sfortunatamente, mi sembra di correre in un altro problema. Ho modificato la domanda. – Atmocreations

4

Per quanto riguarda la modifica: Put "-Wl, - no-whole-archive" alla fine del comando di collegamento che stai utilizzando. Questo lo ha risolto per me.