2010-05-04 12 views
13

Al compilar nuestro proyecto, creamos varios archivos (bibliotecas estáticas), por ejemplo liby.a y libz.a que contienen un archivo de objeto que define una función y_function() y z_function(). Luego, estos archivos se unen en un objeto compartido, digamos libyz.so, que es uno de nuestros principales destinos distribuibles.¿Cómo incluir todos los objetos de un archivo en un objeto compartido?

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 

Al usar este objeto compartido en el programa de ejemplo, digamos que x.c, el enlace falla debido a un referencias indefinidas a funciones y_function() y z_function().

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

Sin embargo, funciona cuando conecto el ejecutable final directamente con los archivos (bibliotecas estáticas).

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

Mi suposición es que los archivos de objetos contenidos en los archivos no están vinculados en la biblioteca compartida, ya que no se utilizan en ella. ¿Cómo forzar la inclusión?

Editar:

Inclusión se puede forzar el uso de --whole-archivo ld opción. Pero si produce errores de compilación:

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 

¿Alguna idea de dónde viene esto?

Respuesta

18

Usted podría intentar (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. 

(-Wl gcc, - todo el archivo)

Además, se debería poner -Wl,--no-whole-archive al final de la lista de bibliotecas. (como dice Dmitry Yudakov en el comentario a continuación)

+0

Gracias, esto se parece a lo que estoy buscando, pero genera un error de enlace No puedo entender de dónde viene. Agregué detalles en la pregunta. –

+2

hay una nota importante en 'man ld' para esta opción: no olvides usar -Wl, -no-whole-archive después de tu lista de archivos, porque gcc agregará su propia lista de archivos a tu enlace y no podrás quiero que esta bandera también los afecte –

Cuestiones relacionadas