serie linking library example gcc linker shared-libraries

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 entorno LD_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.