¿Dónde está LD_LIBRARY_PATH? ¿Cómo configuro la variable env LD_LIBRARY_PATH?

26

Estoy tratando de construir un programa c ++ usando Unix.

Recibí el error

Linking CXX executable ../../bin/ME
/usr/bin/ld: cannot find -lboost_regex-mt

Escuché que solo necesito establecer la ubicación de libboost * en mi variable de entorno LD_LIBRARY_PATH y luego invocar make como lo hice originalmente, escribiendo

-L /usr/lib64 -l boost_regex-mt

o

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

¿Pero dónde está LD_LIBRARY_PATH? ¿Cómo configuro la variable env LD_LIBRARY_PATH?

csx
fuente
¿Por qué editó la mayor parte de su pregunta mientras proporcionaba un contexto útil para comprender su problema?
jlliagre
@jlliagre Estoy de acuerdo: sin el contexto proporcionado por la pregunta original, la respuesta mejor votada no tiene sentido. Lo hice retroceder.
John1024

Respuestas:

25

¿Cómo configuro la variable env LD_LIBRARY_PATH?

Ya lo configuró cuando hizo esto:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Pero eso no resolverá tu problema. $LD_LIBRARY_PATHse consulta en el momento de la ejecución, para proporcionar una lista de directorios adicionales en los que buscar bibliotecas vinculables dinámicamente. No se consulta en el momento del enlace (¡excepto tal vez para localizar bibliotecas requeridas por las propias herramientas integradas!).

Para decirle al vinculador dónde encontrar bibliotecas en el momento de la compilación, debe usar la -Lopción del vinculador. Tú ya hiciste eso también:

-L /usr/lib64

Si todavía recibe el error, debe asegurarse de que la biblioteca esté realmente allí. ¿Tiene un archivo libboost_regex-mt.soo libboost_regex-mt.aen ese (o cualquier) directorio? Tenga en cuenta que un archivo como libboost_regex-mt.so.othersuffixno cuenta para este propósito. Si no tiene eso, entonces probablemente necesite instalar el paquete de desarrollo de su distribución para esta biblioteca.

Celada
fuente
En Linux, de acuerdo con la página de comando man ld (1), $LD_LIBRARY_PATHtambién es consultado por ld: «5. Para un enlazador nativo, busque el contenido de la variable de entorno" LD_LIBRARY_PATH ". »
vinc17
@csx: ¿cuál es tu distribución? Ubuntu, Fedora, CentOS, etc. Consulte aquí, por ejemplo: stackoverflow.com/questions/15874220/…
slm
@ vinc17, esa cita de la página de ldmanual solo se refiere a dependencias recursivas: bibliotecas dependientes de una biblioteca que ya se seleccionó para vincular. No se trata de encontrar bibliotecas para el ejecutable que se está construyendo. Eso es lo que -Lhace.
Celada
@csx No sé nada sobre Linux científico, pero si apt-getle da un comando no encontrado, entonces no es derivado de Debian, por lo que necesita otro método para instalar el paquete que falta. Sin embargo, ese es definitivamente tu problema.
Celada
Tarde pero: -Ldir -llibdebería funcionar como argumentos para ldo gcc/g++/etcal incluir la fase de enlace, pero Q original y restaurado menciona make: con un archivo MAKE normal que probablemente necesite LDFLAGS="whatever"y con un archivo MAKE inteligente puede necesitar casi cualquier cosa, incluidos ladrillos para lanzar al autor del archivo MAKE inteligente.
dave_thompson_085
11

Otra forma de agregar permanentemente una nueva ruta en LD_LIBRARY_PATH:

Editar .confarchivo en /etc/ld.so.conf.d/.

Alguna vez instalé una aplicación y sus bibliotecas no pudieron ser reconocidas por otra aplicación. Luego agrego la ruta, es decir /usr/local/hdf5/lib, al x86_64-linux-gnu.confarchivo. Solo pon en la siguiente línea. Salvar.

Entonces corre sudo ldconfig

Funcionó.

PS: sistema operativo Ubuntu 14.04

iparjono
fuente
4

Puede configurarlo en su ~/.profilearchivo de inicio específico o de su shell (por ejemplo, ~/.bashrcpara bash, ~/.zshenvpara zsh). Luego, debe reiniciar su shell (y posiblemente cerrar sesión e iniciar sesión nuevamente, según su elección).

Puede verificar su configuración con:

env | grep '^LD_LIBRARY_PATH'

EDITAR: LD_LIBRARY_PATHes para bibliotecas compartidas que contienen código de máquina, cuyos nombres de archivo generalmente contienen .sosu nombre, posiblemente seguido de números separados por puntos para distinguir las diferentes versiones. Es posible que LD_LIBRARY_PATH, a pesar de esto , no se encuentre una biblioteca debido a la falta de coincidencia de ABI. Tenga en cuenta también que los lenguajes (como Perl y Python) y los paquetes pueden tener su propio sistema de bibliotecas (posiblemente también con .soarchivos), no relacionados LD_LIBRARY_PATH.

vinc17
fuente
Mi programa compilado todavía se queja de no encontrar una biblioteca de Python, aunque veo la ruta correcta usando env | grep '^ LD_LIBRARY_PATH'. ¿Cual podría ser el problema?
Herman Toothrot
@HermanToothrot He actualizado mi respuesta. Tenga en cuenta que python tiene su propio sistema de bibliotecas. Sospecho que no se usa LD_LIBRARY_PATH(para evitar colisiones con las bibliotecas habituales). Debe hacer una pregunta específica para esto, con el mensaje de error que recibe.
vinc17
3

Si el error de la ruta de la biblioteca está en el vinculador, durante la compilación, debe agregar la ruta a la biblioteca en la variable $ LD_LIBRARY_PATH. Si el error de la biblioteca es cuando realmente ejecuta el programa compilado, entonces necesita agregar la ruta de la biblioteca a /etc/ld.so.conf y ejecutar ldconfig para reconstruir la caché de la ruta de búsqueda de la biblioteca.

Gary
fuente
esto funcionó muy bien! Mi archivo conf apunta a este directorio /etc/ld.so.conf.d, así que solo agregue un archivo con su ruta de libs a esa carpeta. también asegúrese de ejecutar ldconfig como root (o sudo)
RLaaa
0

Resuelto con:

agregar a /etc/systemd/system/pm2-node.service

Environment=PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/app/nodejs/local/nvm/versions/node/v7.8.0/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/node/.pm2
Environment=LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2
Environment=OCI_LIB_DIR=/opt/oracle/instantclient_12_2
Dave
fuente