5

Tengo un proyecto donde tengo una biblioteca estática libhelper.a y otra con mi biblioteca de objetos compartidos, libtestlib.so. Mi objetivo es vincular libhelper.a en libtestlib.so. ¿Es eso posible en Linux/BSD? Cuando intenté y ha creado un programa de prueba que tengo los siguientes errores:Mezcla de bibliotecas estáticas y bibliotecas compartidas

./prog1:/usr/local/lib/libtestlib.so.1.0: undefined símbolo ''

Mi conjetura es que esto está ocurriendo porque libhelper.a no se compiló con -fPIC mientras que libtestlib.so fue. ¿Cuál es la forma correcta de crear programas que usan bibliotecas compartidas que también tienen dependencias en bibliotecas estáticas?

Gracias!

+0

"enlace libhelper.a en libtestlib.so" ¿Qué? –

+0

¿Qué has intentado hasta ahora? En cualquier caso, no conozco ninguna forma de vincular código que no sea PIC a una biblioteca compartida. Las bibliotecas estáticas generalmente solo están vinculadas en ejecutables, por eso rara vez se compilan con PIC. ¿No puedes vincular ambas bibliotecas en el ejecutable o compilar ambas con PIC desde el principio? – Philipp

Respuesta

11

Mi objetivo es vincular libhelper.a en libtestlib.so. ¿Es eso posible en Linux?

Sure. Esto debería hacer:

gcc -shared -fPIC -o libtestlib.so $(OBJS) \ 
    -Wl,--whole-archive -lhelper -Wl,--no-whole-archive 

libhelper.a no fue compilado con -fPIC

Es mejor para reconstruir libhelper.a con -fPIC. Si eso no es posible, el comando anterior seguirá funcionando en Linux/ix86, pero no en p. Linux/x86_64.

¿Cuál es la forma correcta de crear programas que usan bibliotecas compartidas que también tienen dependencias en bibliotecas estáticas?

Si incluye libhelper.a en libtestlib.so que el anterior, entonces simple:

gcc main.c -ltestlib 

es todo lo que necesita. Si insistes en vincular con libhelper.a, debes decirle al usuario final que debe vincular con, por ejemplo,

gcc main.c -ltestlib -lhelper 

No hay manera de especificar que libtestlib.so depende de libhelper.a.

+0

Gracias, puedo reconstruir libhelper.a con -fPIC, así que continuaré haciéndolo. –

Cuestiones relacionadas