cpp compiler compile linux gcc compilation

compiler - gcc linux install



Deshágase de "gcc-/ usr/bin/ld: no se encontró el lib de advertencia" (4)

Asegúrese de que las rutas a las bibliotecas necesarias sean conocidas por el vinculador de tiempo de ejecución. Esto se hace agregando un archivo en /etc/ld.so.conf.d/ con la ruta necesaria. Por ejemplo, /etc/ld.so.conf.d/foo con los siguientes contenidos:

/usr/local/lib/foo/

Si tiene una versión de Linux muy antigua, es posible que /etc/ld.so.conf.d/ no sea compatible, en cuyo caso es posible que tenga que agregar las rutas directamente en el archivo /etc/ld.so.conf.

Después de hacer eso, necesita actualizar la base de datos del enlazador ejecutando el comando "ldconfig".

Tengo la siguiente advertencia durante el enlace:

/usr/bin/ld: warning: libxxx.so.6, needed by /a/b/c/libyyy.so, not found (try using -rpath or -rpath-link)

La configuración de la variable de entorno LD_LIBRARY_PATH = path_to_libxxx.so.6 silencia la advertencia (agregar -Lpath_to_libxxx.so.6 no ayuda).

Tengo un servidor de compilación separado, donde el binario resultante solo se compila. El binario se ejecuta en otro servidor y allí se ve el archivo binario ldd executable (se comprueba con el ldd executable ).

¿Hay otra forma de deshacerse de la advertencia en el momento de la compilación (la tengo varias veces y es muy molesta)?


Es necesario agregar la biblioteca dinámica equivalente de -L :

-Wl,-rpath-link,/path/to/lib

Esto hará que el enlazador busque bibliotecas compartidas en lugares no estándar, pero solo con el propósito de verificar que el enlace sea correcto.

Si desea que el programa encuentre la biblioteca en esa ubicación en tiempo de ejecución , entonces hay una opción similar para hacerlo:

-Wl,-rpath,/path/to/lib

Pero, si su programa funciona bien sin esto, entonces no lo necesita.


La única forma de silenciar estas advertencias usando las opciones de la línea de comando sería el indicador -L que curiosamente no funciona para usted (quizás pueda publicar más detalles sobre esto). Como la advertencia es generada por ld , podríamos intentar usar -Wl,option para deshabilitar una advertencia del vinculador, pero de la documentación de GNU ld, sin embargo, no hay opción para (des) activar estas advertencias.

Así que esto nos deja con la escritura de un script de envoltorio que filtra esta advertencia o compila una versión personalizada de ld .


Sé que esto es viejo, pero aquí hay una mejor solución :

La causa raíz:

El problema realmente ocurre cuando LD invocado por GCC comienza a resolver las dependencias de la biblioteca. Tanto GCC como LD son conscientes de las bibliotecas que contienen sysroot, sin embargo, a LD le falta un componente crítico: el archivo /etc/ld.so.conf. Aquí hay un archivo exampleld.so.conf de un sistema Raspberry PI:

incluye /etc/ld.so.conf.d/*.conf

El directorio /etc/ld.so.conf.d contiene los siguientes archivos:

00-vmcs.conf: / opt / vc / lib

arm-linux-gnueabihf.conf:

/ lib / arm-linux-gnueabihf / usr / lib / arm-linux-gnueabihf

libc.conf:

/ usr / local / lib

La solucion universal

El problema se puede resolver fácilmente copiando los archivos de configuración de LD a una ubicación donde el LD de Cross-toolchain pueda encontrarlos. Sin embargo, hay un inconveniente: si su cadena de herramientas cruzadas fue construida con MinGW (la mayoría lo es), probablemente no tuvo acceso a la función glob (), por lo que no podrá analizar una declaración de inclusión habilitada con comodines como * .conf . La solución aquí es simplemente combinar manualmente el contenido de todos los archivos .conf de /etc/ld.so.conf.d y pegarlos en /etc/ld.so.conf

* / opt / vc / lib

/ lib / arm-linux-gnueabihf

/ usr / lib / arm-linux-gnueabihf

/ usr / local / lib *

Una vez que cree el archivo ld.so.conf en la carpeta correcta, su cadena de herramientas podrá resolver todas las referencias de la biblioteca compartida automáticamente y no verá ese mensaje de error nuevamente.