2010-04-15 25 views
26

Bajo gcc (g ++), he compilado una biblioteca estática .a (llámalo some_static_lib.a). Quiero vincular (¿es esa la frase correcta?) Este archivo .a en otra biblioteca dinámica (llámalo libsomeDyn.so) que estoy creando. Aunque el .so compila, no veo contenido de .a bajo .so usando nm comando:cómo vincular la biblioteca estática a la biblioteca dinámica en gcc

/usr/bin/g ++ -fPIC -g -O2 -Wall -Werror -pipe -march = pentium3 -mtune = prescott -MD -D_FILE_OFFSET_BITS = 64 -DLINUX -D_GNU_SOURCE -D_THREAD_SAFE -I ../../../../../../../../ -I ../../ .. /../../../../..//libraries -Wl, -rpath,/usr/lib -o libsomeDyn.so alguna.o otra.o some_static_lib.a -shared -Wl -x - Wl, -soname, libsomeDyn.so

No veo las funciones en some_static_lib.a en libsomeDyn.so. ¿Qué estoy haciendo mal?

Respuesta

33

Las bibliotecas estáticas tienen reglas especiales a la hora de vincular. Un objeto de la biblioteca estática solo se agregará al binario si el objeto proporciona un símbolo no resuelto.

En Linux, puede cambiar ese comportamiento con la opción --whole-archive enlazador:

g++ -Wl,--whole-archive some_static_lib.a -Wl,--no-whole-archive 
+0

Tengo una dependencia extraña en la biblioteca estática. Hace referencia a una función incluida en la biblioteca dinámica. ¿Cómo le digo a gcc que encuentre la referencia indefinida dentro de la biblioteca dinámica? Gracias – bob

+0

@bob - no debería haber ningún problema con la biblioteca estática que hace referencia a un símbolo dentro de la biblioteca dinámica (una vez que vincula una biblioteca estática, es exactamente lo mismo que si directamente hace referencia al .o en la línea de comandos). Sospecho que debe haber algún otro problema y recomiendo publicar una nueva pregunta. –

+0

Fue la solución para mí, pero en OSX tuve que usar '-all_load' como equivalente a' --whole-archive' como alguien me sugirió en el IRC. ¡Espero que pueda ayudar a alguien más! – vmonteco

14

Por cada uno que viene a través de ese problema como yo (y no se ha de entender la respuesta correcta): aquí es un corto howto generar una biblioteca dinámica (libmylib.so) a partir de una estática (mylib.a):

1.) crear un archivo mylib.c que sólo importa el archivo mylib.h

2.) compilar este mibiblioteca .c a mylib.o con

gcc -c -fPIC mylib.c -o msat.o 

3.) generar una biblioteca dinámica con el siguiente comando:

gcc --whole-archive -shared -Wl,-soname,libmylib.so -o libmylib.so mylib.o mylib.a 

que trabajaron al menos para mí, convirtiendo una biblioteca estática (compilado con -fPIC) a una biblioteca dinámica. No estoy seguro de si esto funcionará para otras bibliotecas.

+2

¿se supone que el paso 2 dice "mylib.o" en lugar de "msat.o"? – mwag

+0

No lo he probado, pero la idea básica probablemente sea correcta. Técnicamente, --whole-archive es una opción del enlazador (gcc no lo entenderá si lo pasa como "gcc --whole-archive"). En su lugar, debe pasar de "-Wl", por ejemplo: gcc -shared -Wl, - whole-archive, -soname, libmylib.so ... Editaría la respuesta, pero no tengo manera de probar si trabajos. En la forma actual, dará lugar a un error de gcc ("opción de línea de comando no reconocida '--whole-archive'"). –

+0

También el -WL, - todo-archivo ...-Wl, - no-todo-el bloque de archivo debe estar alrededor de la biblioteca estática (mylib.a). Como en la respuesta aceptada. –

Cuestiones relacionadas