LD_LIBRARY_PATH vs LIBRARY_PATH

159

Estoy construyendo un programa C ++ simple y quiero sustituir temporalmente una biblioteca compartida suministrada por el sistema con una versión más reciente del mismo, para desarrollo y pruebas.

Intenté configurar la variable LD_LIBRARY_PATH pero el enlazador (ld) falló con:

/ usr / bin / ld: no se puede encontrar -lyaml-cpp

Esperaba que funcionara porque de acuerdo con la página de manual de ld:

El vinculador utiliza las siguientes rutas de búsqueda para localizar las bibliotecas compartidas requeridas: ... Para un vinculador nativo, el contenido de la variable de entorno "LD_LIBRARY_PATH" ...

Luego intenté configurar LIBRARY_PATH, y eso funcionó.

De acuerdo con el manual de GCC:

El valor de LIBRARY_PATH es una lista de directorios separados por dos puntos, al igual que PATH. Cuando se configura como un compilador nativo, GCC prueba los directorios así especificados cuando busca archivos vinculadores especiales, si no puede encontrarlos usando GCC_EXEC_PREFIX. Vincular usando GCC también usa estos directorios cuando busca bibliotecas ordinarias para la opción -l (pero los directorios especificados con -L son lo primero).

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

Pero..

  • Como me conecto con gcc, ¿por qué se llama a ld, como sugiere el mensaje de error?
  • ¿Cuál es el punto de tener dos variables que tengan el mismo propósito? ¿Hay otras diferencias?
Georgios Politis
fuente

Respuestas:

213

LIBRARY_PATH gcc lo utiliza antes de la compilación para buscar directorios que contienen bibliotecas estáticas y compartidas que deben vincularse a su programa.

LD_LIBRARY_PATHes utilizado por su programa para buscar directorios que contienen bibliotecas compartidas después de que se haya compilado y vinculado con éxito.

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, entonces debe estar vinculada dinámicamente a su programa y eso es cuando LD_LIBRARY_PATHentra en juego.

Naveen
fuente
14
Y, por supuesto, LD_LIBRARY_PATH solo tiene sentido con las bibliotecas dinámicas
Alex Jasmin el
2
Mi punto es que si tuviera que usar ld para vincular (directamente), entonces, de acuerdo con el manual de ld, LD_LIBRARY_PATH se habría utilizado para buscar directorios que contengan las bibliotecas que deben vincularse a mi programa. Debo estar perdiendo algo aquí ...
Georgios Politis
2
a menos que invoque usted mismo y combine los archivos de objetos con las bibliotecas, 'heredará' la ruta que le pasa gcc. Puede anular el gcc estándar, con las opciones de -Xlinker.
Naveen
55
En realidad, LIBRARY_PATH se usa para buscar directorios que contienen bibliotecas estáticas Y dinámicas, en lugar de solo bibliotecas estáticas.
partícula
3
Sí, esto está mal: la diferencia es que LIBRARY_PATHse buscan bibliotecas (estáticas o dinámicas) en tiempo de compilación y LD_LIBRARY_PATHse buscan bibliotecas dinámicas en tiempo de ejecución. Por supuesto, en tiempo de ejecución no necesita buscar bibliotecas estáticas.
Timmmm
47

LD_LIBRARY_PATHse busca cuando se inicia el programa, LIBRARY_PATHse busca en el momento del enlace.

advertencia de los comentarios :

F'x
fuente
38
Nota: al vincular las bibliotecas, ldpor sí mismo no se ve para las bibliotecas, ya sea en LIBRARY_PATHo LD_LIBRARY_PATH. Es sólo cuando gccinvoca ldque LIBRARY_PATHse acostumbra. (Aprendí esto de la manera difícil.)
Rufflewind
1
@Rufflewind Interesante, pero hubiera sido aún más si hubieras dado alguna referencia.
hmijail llora a los resignatarios
Esta vista hace una distinción en el momento en que se buscan las bibliotecas (tiempo de enlace versus tiempo de ejecución) mientras que @Naveen hace una distinción del tipo de bibliotecas que se buscan (estático v dinámico). ¿Hay dos vistas efectivamente idénticas (dinámica: tiempo de ejecución = estática: tiempo de enlace) o hay situaciones importantes cuando esta correspondencia no se mantiene? Supongo que también se necesita algún conocimiento sobre las bibliotecas dinámicas en tiempo de compilación.
XavierStuvw
13

Como me conecto con gcc, ¿por qué se llama a ld, como sugiere el mensaje de error?

gcc llama a ld internamente cuando está en modo de enlace.

heroxbd
fuente