librerias - cómo vincular la biblioteca estática a la biblioteca dinámica en gcc
creacion de librerias dinamicas en java (2)
Las bibliotecas estáticas tienen reglas especiales cuando se trata 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 --whole-archive
linker:
g++ -Wl,--whole-archive some_static_lib.a -Wl,--no-whole-archive
Bajo gcc (g ++), he compilado una biblioteca static .a
( some_static_lib.a
). Quiero vincular (¿es esa la frase correcta?) Con este archivo .a
en otra biblioteca dinámica (llámalo libsomeDyn.so
) que estoy creando. Aunque el .so
compila, no veo el contenido de .a
en .so
usando el comando nm
:
/ 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 some.o another.o some_static_lib.a -shared -Wl -x -Wl, -soname, libsomeDyn.so
No veo funciones en some_static_lib.a
en libsomeDyn.so
. ¿Qué estoy haciendo mal?
Para cada uno que se encuentra con ese problema como yo (y no ha entendido la respuesta correctamente): aquí hay un breve cómo generar una biblioteca dinámica (libmylib.so) a partir de una estática (mylib.a):
1.) crea un archivo mylib.c que solo importa el archivo mylib.h
2.) compila este mylib.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
Eso funcionó al menos para mí, convirtiendo una biblioteca estática (compilada con -fPIC) en una biblioteca dinámica. No estoy seguro de si esto funcionará para otras bibliotecas.