2010-11-22 19 views
109

Estoy compilando un programa simple en C++ y quiero sustituir temporalmente una biblioteca compartida suministrada por el sistema por una versión más reciente, para desarrollo y prueba.LD_LIBRARY_PATH contra LIBRARY_PATH

I intentado fijar la variable LD_LIBRARY_PATH pero el enlazador (ld) falló con:

/usr/bin/ld: no puede encontrar -lyaml-CPP

que esperaba que para trabajar porque de acuerdo a la página del manual ld:

el enlazador utiliza la siguiente búsqueda caminos para localizar bibliotecas compartidas requeridas: ... para un l nativa entintador, el contenido de la variable de entorno "LD_LIBRARY_PATH" ...

que después intentaron establecer la LIBRARY_PATH, y que trabajaron.

Según el manual GCC:

El valor de LIBRARY_PATH es una lista separada por dos puntos de directorios, al igual que PATH. Cuando se configura como un compilador nativo, GCC prueba los directorios así especificados al buscar archivos del enlazador especial , si no puede encontrarlos usando GCC_EXEC_PREFIX. La vinculación con GCC también utiliza estos directorios cuando busca bibliotecas ordinarias para la opción -l (pero los directorios especificados con -L son los primeros).

Como sugiere el manual (GCC), LIBRARY_PATH funciona porque enlazo con GCC.

Pero ..

  • Desde enlazo con gcc qué ld está siendo llamado , como el mensaje de error sugiere?
  • ¿Cuál es el punto de que tiene dos variables que sirven el mismo propósito ? ¿Hay alguna otra diferencia de ?

Respuesta

156

LIBRARY_PATH es usado por gcc antes de la compilación de directorios que contienen bibliotecas estáticas que deben ser vinculados a su programa de búsqueda.

LD_LIBRARY_PATH es utilizado por su programa para buscar directorios que contienen bibliotecas compartidas después de que se haya compilado y vinculado correctamente.

EDITAR: Como se señala a continuación, sus bibliotecas pueden ser estáticas o compartidas. Si es estático, el código se copia en su programa y no necesita buscar la biblioteca después de compilar y vincular su programa. Si su biblioteca se comparte, debe estar vinculada dinámicamente a su programa y es cuando entra en juego el LD_LIBRARY_PATH.

+11

Y de LD_LIBRARY_PATH supuesto sólo tiene sentido con las bibliotecas dinámicas –

+2

Mi punto es que si tuviera que utilizar ld para vincular (directamente), entonces, de acuerdo con el manual de LD, LD_LIBRARY_PATH habría ha utilizado para buscar directorios que contienen las librerías que necesitan estar vinculadas a mi programa. Me falta algo aquí. –

+1

a menos que invoque usted mismo y combine los archivos objeto con las bibliotecas, 'heredará' la ruta que gcc le transfiere. Puede anular el gcc estándar, con las opciones -Xlinker. – Naveen

29

LD_LIBRARY_PATH se busca cuando se inicia el programa, LIBRARY_PATH es búsquedas en tiempo de enlace.

+27

Nota: cuando se vinculan bibliotecas, 'ld' por sí mismo no busca bibliotecas en' 'LIBRARY_PATH'' o' LD_LIBRARY_PATH'. Solo cuando 'gcc' invoca' ld' se utiliza 'LIBRARY_PATH'. (Aprendí esto de la manera difícil.) – Rufflewind

+1

@Rufflewind Interesante, pero habría sido aún más si hubieras dado alguna referencia. – hmijail

8

Dado que me enlace con gcc ¿por qué ld se está llamando, como sugiere el mensaje de error?

gcc llama a ld internamente cuando está en el modo de vinculación.