flag compiler gcc g++ ld

flag - gcc compiler linux



LD_LIBRARY_PATH vs LIBRARY_PATH (3)

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

gcc llama a ld internamente cuando está en modo vincular.

Estoy construyendo un programa simple de C ++ y quiero sustituir temporalmente una biblioteca compartida suministrada por el sistema por una versión más reciente de la misma, para desarrollo y prueba.

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

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

Esperaba que eso funcionara, porque de acuerdo con la página ld man:

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 funcionó.

De acuerdo con el manual de GCC:

El valor de LIBRARY_PATH es una lista de directorios separados por dos puntos, muy similar a PATH. Cuando se configura como compilador nativo, GCC prueba los directorios especificados al buscar archivos enlazadores especiales, 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 me enlace con GCC.

Pero..

  • Como me enlace con gcc, ¿por qué ld se está llamando, como sugiere el mensaje de error?
  • ¿De qué sirve tener dos variables que sirvan para el mismo propósito? ¿Hay otras diferencias?

LD_LIBRARY_PATH se busca cuando se inicia el programa, LIBRARY_PATH se busca en el tiempo del enlace.

advertencia de los comments :


LIBRARY_PATH es utilizado por gcc antes de la compilación para buscar directorios que contengan bibliotecas estáticas que deben estar vinculadas a su programa.

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 es compartida, entonces debe estar vinculada dinámicamente a su programa y ahí es cuando LD_LIBRARY_PATH entra en juego.