2011-10-28 8 views
14

Estoy compilando algunos objetos compartidos archivo en una archive.a:archivos de enlace (.a) en objeto compartido (.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 

Hasta aquí todo bien. El resultante archive.a tiene un buen tamaño de algunos KB. Un volcado con nm muestra que los archivos de objeto correspondientes están contenidos en los archivos.

Ahora quiero compilar varios de estos archivos en un archivo de objeto compartido.

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

El resultado es que mi archivo de la biblioteca resultante es casi vacío :

$ 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 

Alguna idea de lo que estoy haciendo mal?


Editar:

Cuando intento el interruptor -Wl,--whole-archive, ocurre lo siguiente:

/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

posible duplicado de [¿Cómo incluir todos los objetos de un archivo en un objeto compartido?] (Http://stackoverflow.com/questions/2763988/how-to-include-all-objects-of-an-archive- in-a-shared-object) – Atmocreations

Respuesta

15

símbolos/ficheros objeto en .a archivos que no se utiliza, se descartarán por el enlazador .

Uso -Wl,--whole-archive para la vinculación de incluir todo el archivo .a Editar, tendrá que añadir -Wl,--no-whole-archive después de especificar su biblioteca, así que todo el asunto será -Wl,--whole-archive archive1.a archive2.a -Wl,--no-whole-archive

+0

Gracias por su rápida respuesta. Desafortunadamente, parezco correr en otro problema. Modifiqué la pregunta. – Atmocreations

4

Con respecto a su edición: Ponga "-Wl, - no-whole-archive" al final del comando de enlace que está ejecutando. Eso lo solucionó para mí.

Cuestiones relacionadas