c++ - reales - ¿Cómo especificar la preferencia de la ruta de la biblioteca?
libro de android studio en español pdf (5)
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
.
Estoy compilando un programa 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 ++
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?
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 usa uno para trabajar con DLL en Windows y desea omitir .so números de versión en linux / QT, agregar "CONFIG + = plugin" eliminará los números de versión. Usar la ruta absoluta a .so, dándole al enlazador funciona bien, como mencionó el Sr. Klatchko.
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)