c - raspberry - ldpath linux
¿Por qué tengo que definir LD_LIBRARY_PATH con una exportación cada vez que ejecuto mi aplicación? (7)
¿Usted ''exportó'' en su .bashrc?
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/path/to/library"
Tengo un código que usa algunas bibliotecas compartidas (código c en gcc). Al compilar, debo definir explícitamente los directorios de inclusión y biblioteca usando -I y -L, ya que no están en los lugares estándar. Cuando intento ejecutar el código, aparece el siguiente error:
./sync_test
./sync_test: error while loading shared libraries: libsync.so: cannot open shared object file: No such file or directory
Sin embargo, haz lo siguiente, todo funciona bien:
export LD_LIBRARY_PATH="/path/to/library/"
./sync_test
Ahora, la parte extraña es que esto solo funciona una vez. Si intento ejecutar sync_test nuevamente, recibo el mismo error a menos que ejecute primero el comando de exportación. Intenté agregar lo siguiente a mi .bashrc, pero no hizo ninguna diferencia:
LD_LIBRARY_PATH="/path/to/library/"
Debes evitar establecer LD_LIBRARY_PATH
en tu .bashrc
. Consulte " Why LD_LIBRARY_PATH is bad
" para obtener más información.
Utilice la opción linker -rpath al enlazar para que el enlazador dinámico sepa dónde encontrar libsync.so
durante el tiempo de ejecución.
gcc ... -Wl,-rpath /path/to/library -L/path/to/library -lsync -o sync_test
EDITAR:
Otra forma sería usar una envoltura como esta
#!/bin/bash
LD_LIBRARY_PATH=/path/to/library sync_test "$@"
Si sync_test
inicia cualquier otro programa, podría terminar usando las librerías en /path/to/library
que pueden o no ser intencionadas.
En lugar de anular la ruta de búsqueda de la biblioteca en tiempo de ejecución con LD_LIBRARY_PATH, en su lugar, podría hornearlo en el propio binario con rpath
. Si enlaza con GCC agregando -Wl,-rpath,<libdir>
debería hacer el truco, si enlaza con ld es solo -rpath <libdir>
.
Lo que también puede hacer, si es algo que instaló en su sistema, es agregar el directorio que contiene las bibliotecas compartidas a su archivo /etc/ld.so.conf , o crear un nuevo archivo en /etc/ld.so. conf.d /
(He revisado RHEL5 y la distribución de Ubuntu, así que creo que es genérico para Linux)
El programa ldconfig se asegurará de que estén incluidos en todo el sistema.
Consulte el siguiente enlace para obtener más información: www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/dlls.html
Podría agregar en su código un sistema de llamadas con la nueva definición:
sprintf(newdef,"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:%s:%s",ld1,ld2);
system(newdef);
Pero, no sé, esa es la solución correcta, pero funciona.
Saludos
Puedes poner todo esto en una línea:
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library" ./sync_test
Debería hacer las cosas un poco más fáciles, incluso si no cambia nada fundamental
Utilizar
export LD_LIBRARY_PATH="/path/to/library/"
en su .bashrc de lo contrario, solo estará disponible para bash y no para los programas que inicie.
Pruebe -R/path/to/library/
marca cuando está vinculando, hará que el programa se vea en ese directorio y no necesitará establecer ninguna variable de entorno.
EDITAR: Parece que -R
es solo Solaris, y estás en Linux.
Una forma alternativa sería agregar la ruta a /etc/ld.so.conf
y ejecutar ldconfig
. Tenga en cuenta que este es un cambio global que se aplicará a todos los binarios enlazados dinámicamente.