¿Por qué tengo que definir LD_LIBRARY_PATH con una exportación cada vez que ejecute mi solicitud?

StackOverflow https://stackoverflow.com/questions/695530

Pregunta

Tengo algo de código que utiliza algunas bibliotecas compartidas (código c en GCC). Al compilar tengo que definir explícitamente la inclusión y directorios de bibliotecas con -I y -L, ya que no están en los lugares habituales. Cuando trato de ejecutar el código, me sale 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, hacer lo siguiente, todo funciona muy bien:

export LD_LIBRARY_PATH="/path/to/library/"
./sync_test

Ahora, la parte extraña es, esto sólo funciona una vez. Si trato y corro sync_test de nuevo me sale el mismo error a menos que funciono con el comando de exportación en primer lugar. He intentado añadir lo siguiente a mi .bashrc, pero no había ninguna diferencia:

LD_LIBRARY_PATH="/path/to/library/"
¿Fue útil?

Solución

Uso

export LD_LIBRARY_PATH="/path/to/library/"

en su .bashrc lo contrario, sólo será disponible para golpear y no todos los programas que de comienzo.

Trate bandera -R/path/to/library/ en el enlazado, que va a hacer el aspecto del programa en ese directorio y usted no tendrá que establecer las variables de entorno.

EDIT: Parece que -R es Solaris solamente, y está en Linux

.

Una forma alternativa sería añadir la ruta de acceso 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.

Otros consejos

Se debe evitar el establecimiento de LD_LIBRARY_PATH en su .bashrc. Ver "Why LD_LIBRARY_PATH is bad" para más información.

Utilice la opción del vinculador -rpath durante el enlazado de manera que enlazador dinámico sabe 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

EDIT:

Otra manera sería utilizar un envoltorio como esto

#!/bin/bash

LD_LIBRARY_PATH=/path/to/library sync_test "$@"

Si sync_test comienza cualquier otro programa, que podría terminar usando las librerias en /path/to/library que puede o no puedan ser destinados.

se realizó la 'exportación' en su .bashrc?

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/path/to/library"

Usted puede simplemente poner todo esto en una sola línea:

LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library" ./sync_test

En caso de hacer las cosas un poco más fácil, incluso si no cambia nada fundamental

En lugar de anular la ruta de búsqueda de biblioteca en tiempo de ejecución con LD_LIBRARY_PATH, en su lugar podría hornearlo en el binario sí con rpath. Si se enlaza con GCC añadiendo -Wl,-rpath,<libdir> debe hacer el truco, si se vincula con ld es sólo -rpath <libdir>.

Lo que también se puede hacer, si es algo que ha instalado en su sistema, es añadir el directorio que contiene las bibliotecas compartidas de su archivo /etc/ld.so.conf , o hacer una nuevo archivo en /etc/ld.so.conf.d /

(he comprobado tanto la distribución RHEL5 y Ubuntu, así que creo que es genérico para Linux)

El programa ldconfig se asegurará de que se incluyen en todo el sistema.

Vea el siguiente enlace para más información: www.dwheeler.com/secure-programs/Secure-Programs- HOWTO / dlls.html

Se podría añadir en el código de un sistema de llamada con la nueva definición:

sprintf(newdef,"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:%s:%s",ld1,ld2);
system(newdef);

Pero, no sé lo que es la solución rigth pero funciona.

Regards

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top