c - una - hagalo usted mismo repisas de madera
¿Es posible construir una biblioteca compartida con la biblioteca usada de enlace estático? (3)
Si tiene planes de portabilidad para su biblioteca compartida, use libtool(1)
. Manejará la mayoría de los detalles de los indicadores del compilador para usted y le hará la vida infinitamente más fácil. Si no usa libtool
, pero luego decide que desea transferir su programa a OS X o Windows, terminará reinventándolo de todos modos.
Puedo construir un ejecutable con gcc con enlace estático:
gcc -static xxx.c -o xxx
Entonces puedo ejecutar xxx sin ninguna biblioteca dependiente externa.
Pero, ¿y si quiero construir una biblioteca compartida sin una biblioteca dependiente de externel? lo que quiero decir es que quiero que la biblioteca compartida esté enlazada estáticamente con su referencia externa en.
Hay algunos hackers aseados que puedes hacer con Rpath para que un ejecutable ELF o .so busque primero sus archivos .so dependientes en el mismo directorio que él:
hacer un guión corto echo-rpath que consiste en
echo ''-Wl, - rpath = $ ORIGIN''
agréguelo a su línea de comando de compilación como archivo gcc -o -lwhatever
`echo-rpath `
objects
(El mecanismo de eco impide que Make o el shell coman el signo $ y se asegura que pase a ld).
Esto funcionará:
# Generate position independent code (PIC)
gcc -fPIC -c -o xxx.o xxx.c
# Build a shared object and link with static libraries
ld -shared -static -o xxx.so xxx.o
# Same thing but with static libc
ld -shared -static -o xxx.so xxx.o -lc
Una aclaración: el indicador estático, si se le da a gcc, se pasa al vinculador (ld) y le dice que funcione con la versión estática (.a) de una biblioteca (especificada con el distintivo -l), en lugar de la versión dinámica (.so).
Otra cosa: en mi sistema (Debian) el último ejemplo da una libc.a ... recompilación con -fPIC error. Estoy bastante seguro de que eso significa que la libc.a que tengo en mi sistema no se compiló con -fPIC. Sin embargo, una imagen de libc de búsqueda de apt-cache dio algunos resultados.
Ver también: Program Library HOWTO , SO: combinando .so libs , ld (1) , gcc (1)