¿Cómo especificar la preferencia de la ruta de la biblioteca?

Estoy comstackndo un progtwig de c ++ usando g++ y ld . Tengo una biblioteca .so que quiero usar durante la vinculación. Sin embargo, existe una biblioteca del mismo nombre en /usr/local/lib , y ld está eligiendo esa biblioteca sobre la que estoy especificando directamente. ¿Cómo puedo arreglar esto?

Para los ejemplos a continuación, mi archivo de biblioteca es /my/dir/libfoo.so.0 . Cosas que he probado que no funcionan:

  • mi comando g ++ es g++ -g -Wall -o my_binary -L/my/dir -lfoo bar.cpp
  • agregando /my/dir al principio o al final de mi $PATH en`
  • añadiendo /my/dir/libfoo.so.0 como argumento a g ++

Agregue la ruta a donde está su nueva biblioteca a LD_LIBRARY_PATH (tiene un nombre ligeramente diferente en Mac …)

Su solución debería funcionar con las opciones -L/my/dir -lfoo , en tiempo de ejecución use LD_LIBRARY_PATH para apuntar a la ubicación de su biblioteca.

O

Utilice la opción rpath a través de gcc para enlazar – ruta de búsqueda de la biblioteca en tiempo de ejecución, se utilizará en lugar de buscar en el directorio estándar (opción gcc):

 -Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH) 

Esto es bueno para una solución temporal. El vinculador busca primero LD_LIBRARY_PATH para las bibliotecas antes de buscar directorios estándar.

Si no desea actualizar permanentemente LD_LIBRARY_PATH, puede hacerlo sobre la marcha en línea de comandos:

 LD_LIBRARY_PATH=/some/custom/dir ./fooo 

Puede verificar qué bibliotecas conoce el uso del enlazador (ejemplo):

 /sbin/ldconfig -p | grep libpthread libpthread.so.0 (libc6, OS ABI: Linux 2.6.4) => /lib/libpthread.so.0 

Y puede verificar qué biblioteca está usando su aplicación:

 ldd foo linux-gate.so.1 => (0xffffe000) libpthread.so.0 => /lib/libpthread.so.0 (0xb7f9e000) libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7e6e000) librt.so.1 => /lib/librt.so.1 (0xb7e65000) libm.so.6 => /lib/libm.so.6 (0xb7d5b000) libc.so.6 => /lib/libc.so.6 (0xb7c2e000) /lib/ld-linux.so.2 (0xb7fc7000) libdl.so.2 => /lib/libdl.so.2 (0xb7c2a000) libz.so.1 => /lib/libz.so.1 (0xb7c18000) 

Especificar la ruta absoluta a la biblioteca debería funcionar bien:

 g++ /my/dir/libfoo.so.0 ... 

¿Recordó eliminar el -lfoo una vez que agregó la ruta absoluta?

Como alternativa, puede usar las variables de entorno LIBRARY_PATH y CPLUS_INCLUDE_PATH , que indican, respectivamente, dónde buscar bibliotecas y dónde buscar encabezados ( CPATH también hará el trabajo), sin especificar las opciones -L e -I.

Editar: CPATH incluye un encabezado con -I y CPLUS_INCLUDE_PATH con -isystem .

Esta es una vieja pregunta, pero nadie parece haber mencionado esto.

Estabas teniendo suerte de que la cosa se estaba vinculando en absoluto.

Necesitabas cambiar

 g++ -g -Wall -o my_binary -L/my/dir -lfoo bar.cpp 

a esto:

 g++ -g -Wall -o my_binary -L/my/dir bar.cpp -lfoo 

Su enlazador realiza un seguimiento de los símbolos que necesita resolver. Si lee la biblioteca primero, no tiene ningún símbolo necesario, por lo que ignora los símbolos que contiene. Especifique las bibliotecas después de las cosas que necesitan vincularse para que su enlazador tenga símbolos para encontrar en ellas.

Además, -lfoo hace buscar específicamente un archivo llamado libfoo.a o libfoo.so según sea necesario. No libfoo.so.0 . Por lo tanto, ln el nombre o cambie el nombre de la biblioteca como apropiado.

Para citar la página del manual de gcc:

 -l library ... It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in z, those functions may not be loaded. 

Agregar el archivo directamente a la línea de comando de g++ debería haber funcionado, a menos que, por supuesto, lo pones antes de bar.cpp , haciendo que el enlazador lo ignore por carecer de los símbolos necesarios, porque aún no se necesitaban símbolos.

Si se utiliza uno para trabajar con DLL en Windows y desea omitir .so números de versión en linux / QT, al agregar CONFIG += plugin se eliminarán los números de versión. Usar la ruta absoluta a .so, dándole al enlazador funciona bien, como mencionó el Sr. Klatchko.