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?
LIBRARY_PATH
se usa para buscar directorios que contienen bibliotecas estáticas Y dinámicas, en lugar de solo bibliotecas estáticas.LIBRARY_PATH
se buscan bibliotecas (estáticas o dinámicas) en tiempo de compilación yLD_LIBRARY_PATH
se buscan bibliotecas dinámicas en tiempo de ejecución. Por supuesto, en tiempo de ejecución no necesita buscar bibliotecas estáticas.LD_LIBRARY_PATH
se busca cuando se inicia el programa,LIBRARY_PATH
se busca en el momento del enlace.advertencia de los comentarios :
ld
(en lugar degcc
og++
), las variables de entornoLIBRARY_PATH
oLD_LIBRARY_PATH
no se leen.gcc
og++
,LIBRARY_PATH
se lee la variable de entorno (consulte la documentación "gcc
utiliza estos directorios cuando busca bibliotecas ordinarias" ).fuente
ld
por sí mismo no se ve para las bibliotecas, ya sea enLIBRARY_PATH
oLD_LIBRARY_PATH
. Es sólo cuandogcc
invocald
queLIBRARY_PATH
se acostumbra. (Aprendí esto de la manera difícil.)gcc llama a ld internamente cuando está en modo de enlace.
fuente