Pregunta
Estoy construyendo un sencillo programa en C ++ y quiero sustituir temporalmente un sistema suministrado biblioteca compartida con una versión más reciente de ella, para el desarrollo y prueba.
He intentado establecer la variable LD_LIBRARY_PATH pero el enlazador (ld) que ha fallado por:
/ usr / bin / ld: no puede encontrar -lyaml-CPP
Yo esperaba que al trabajo porque de acuerdo a la página del manual ld:
El enlazador utiliza la siguiente búsqueda caminos para localizar compartida necesaria bibliotecas: ... Para un enlazador nativa, el contenido de la variable de entorno "LD_LIBRARY_PATH" ...
Entonces intentado fijar la LIBRARY_PATH, y que trabajado.
De acuerdo con el manual de GCC:
El valor de LIBRARY_PATH es una lista separada por dos puntos de directorios, al igual que PATH. Cuando configurado como un compilador nativo, GCC trata los directorios especificados por tanto, en la búsqueda de enlazador especial archivos, si no puede encontrarlos usando GCC_EXEC_PREFIX. La vinculación utilizando GCC también utiliza estos directorios cuando la búsqueda de bibliotecas comunes para La opción -l (pero directorios especificado con -L llegado primero).
A medida que el (CCG) Manual sugiere, LIBRARY_PATH funciona porque me enlace con GCC.
Pero ..
- Desde enlazo con gcc qué es ld ser llamado, como el mensaje de error sugiere?
- ¿Cuál es el punto de que tiene dos variables que sirven a la misma ¿propósito? ¿Hay alguna otra diferencias?
Solución
LIBRARY_PATH
es utilizado por gcc antes de la compilación de directorios que contienen estática y buscar bibliotecas compartidas que deben estar vinculados a su programa.
LD_LIBRARY_PATH
es utilizado por el programa para buscar directorios que contienen compartido bibliotecas vez que ha sido compilado y vinculado con éxito.
EDIT:
Como se señala más adelante, las bibliotecas pueden ser estáticos o compartido. Si es estática entonces el código se copia en su programa y que no es necesario para buscar la biblioteca después de su programa se compila y se enlaza. Si la biblioteca es compartida entonces tiene que estar vinculada de forma dinámica a su programa y fue entonces cuando LD_LIBRARY_PATH
entra en juego.
Otros consejos
LD_LIBRARY_PATH
se busca cuando se inicia el programa, se busca LIBRARY_PATH
en tiempo de enlace.
- Cuando se enlaza con las bibliotecas
ld
(en lugar degcc
og++
), las variables de entorno oLIBRARY_PATH
LD_LIBRARY_PATH
no se leen. - Cuando se enlaza con las bibliotecas
gcc
og++
, se lee la variable de entornoLIBRARY_PATH
(ver documentación "gcc
utiliza estos directorios en la búsqueda de bibliotecas comunes" ).
Desde aquí I con gcc qué ld está siendo llamado, como sugiere el mensaje de error?
gcc llama ld internamente cuando se encuentra en modo de vinculación.