gcc - linking - shared library c
¿Cómo se especifica una ruta de biblioteca compartida no predeterminada en GCC Linux? Obteniendo "error al cargar bibliotecas compartidas" cuando se ejecuta (2)
Hay una computadora portátil en la que no tengo privilegios de root.
en la máquina tengo una biblioteca instalada usando configure --prefix=$HOME/.usr
.
después de eso, obtuve estos archivos en ~/.usr/lib
:
libXX.so.16.0.0
libXX.so.16
libXX.so
libXX.la
libXX.a
cuando compilo un programa que invoca una función proporcionada por la biblioteca con este comando: gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX
xxx.out se generó sin previo aviso, pero cuando lo ejecuto se produjo un error como este:
./xxx.out: error while loading shared libraries: libXX.so.16: cannot open shared object file: No such file or directory
existe ./xxx.out: error while loading shared libraries: libXX.so.16: cannot open shared object file: No such file or directory
, aunque libXX.so.16
reside allí.
mi suposición sin pistas es que ~/.usr/lib
no se buscó cuando se invoca xxx.out. pero, ¿qué puedo hacer para especificar la ruta de .so, para que xxx.out pueda buscar el archivo .so?
Una adición es cuando doy -static
a gcc, otro error ocurre así:
undefined reference to `function_proviced_by_the_very_librar''
Parece que no importa a pesar de que -L
y -l
se dan a gcc. ¿Qué debo hacer para construir un exe utilizable con esa biblioteca?
Para otras personas que tienen la misma pregunta que yo hice
Encontré un artículo útil en tldp sobre esto.
Introduce una biblioteca cargada estática / compartida / dinámica, así como algunos códigos de ejemplo para usarlos.
¿Debería ser LIBRARY_PATH
lugar de LD_LIBRARY_PATH
? gcc comprueba LIBRARY_PATH
que se puede ver con la opción -v
Hay dos formas de lograr eso:
- Utilice la opción de
-rpath
:
gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX -Wl,-rpath=/home/user/.usr/lib
Use la
LD_LIBRARY_PATH
entornoLD_LIBRARY_PATH
: coloque esta línea en su archivo~/.bashrc
:export LD_LIBRARY_PATH=/home/user/.usr/lib
Esto funcionará incluso para los binarios pregenerados, por lo que puede, por ejemplo, descargar algunos paquetes de debian.org , descomprimir los binarios y las bibliotecas compartidas en su directorio de inicio e iniciarlos sin volver a compilar.
Para una prueba rápida, también puede hacer (en bash al menos):
LD_LIBRARY_PATH=/home/user/.usr/lib ./xxx.out
que tiene la ventaja de no cambiar la ruta de su biblioteca para todo lo demás.