2011-01-03 14 views
19

Estoy construyendo un ejecutable de C++ en Linux. El ejecutable se vincula a algunas bibliotecas de impulso.error al cargar las bibliotecas compartidas: libboost_system.so.1.45.0: no se puede abrir el archivo de objeto compartido: Ningún archivo o directorio

Ésta es la salida cuando intento ejecutar el binario:

[email protected]:~/work/dev/c++/projects/testfgci/dist/Debug/GNU-Linux-x86$ ./testfgci 
./testfgci: error while loading shared libraries: libboost_system.so.1.45.0: cannot open shared object file: No such file or directory 

Luego ejecutar LDD en el binario para comprobar las dependencias:

[email protected]:~/work/dev/c++/projects/testfgci/dist/Debug/GNU-Linux-x86$ ldd testfgci 
    linux-gate.so.1 => (0x00380000) 
    libboost_system.so.1.45.0 => not found 
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00b50000) 
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x005f6000) 
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0099a000) 
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x001b3000) 
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x00110000) 
    /lib/ld-linux.so.2 (0x00ea2000) 

No estoy seguro de por qué el liboos_system.sl .1.45.0 SO no se encuentra. Lo construí con éxito un poco antes hoy. ¿Alguien puede explicar?

+0

Es posible que cuando la construcción, está de paso banderas para el compilador para las bibliotecas de enlazadores adicionales, pero cuando se quiere ejecutar el programa, la bibliotecas Boost Don' t existe en las rutas del enlazador. Posible duplicado de [vincular el problema en las bibliotecas] (http://stackoverflow.com/questions/4568187/linking-problem-in-libraries) – birryree

+1

Encontré la respuesta. Tuve que agregar la ruta a mi LD_LIBRARY_PATH y luego exportarla. El binario se ejecuta, pero informa errores (Sistema de error: 9: descriptor de archivo incorrecto).Tendré que enmendar esta pregunta para reflejar eso, o hacer una nueva pregunta – skyeagle

Respuesta

21

No se encontró la biblioteca.

Las bibliotecas se buscan por defecto en /lib, /usr/lib y en los directorios especificados por /etc/ld.so.conf.

Por lo general, las bibliotecas del sistema (como impulsar, si lo instaló a través de su administrador de paquetes) se encuentran en /usr/lib, pero probablemente no es su caso.

¿Dónde se encuentran las bibliotecas de impulso en su sistema? ¿Compiló usted mismo? En este caso, usted debe decirle al enlazador dinámico a buscar sus bibliotecas en el directorio que se encuentren utilizando la variable de entorno LD_LIBRARY_PATH:

LD_LIBRARY_PATH="your/boost/directory" ./testfgci 

le sugeriría para instalar bibliotecas Boost usando el gestor de paquetes, de todos modos , esto hará que tu vida sea mucho más simple.

15

Sé que este es un antiguo, pero puede ejecutar ldconfig para reconstruir su caché ld. De esta forma no necesita actualizar LD_LIBRARY_PATH.

+1

¡Muchas gracias! – expert

3

Solo quería agregar una nota para los usuarios de Ubuntu (y Debian, supongo): estos sistemas tienen una "característica" de seguridad que borra LD_LIBRARY_PATH. Esto no funciona:

En cualquier /etc/environemnt o ~/.profile o ~/.bash_profile:

export LD_LIBRARY_PATH=/usr/local/boost_1_54_0/stage/lib:$LD_LIBRARY_PATH 

va a trabajar para ~/.bashrc, pero el camino se establecerá sólo para este particular shell interactivo. Esto significa que si invoca make de, p. Ej. emacs o eclipse, no funcionará, a menos que haya lanzado emacs desde el shell y no desde el iniciador.

Esto es lo que funcionó para mí:

echo -e "\n/usr/local/boost_1_54_0/stage/lib" | sudo tee -a /etc/ld.so.conf 
sudo ldconfig 
Cuestiones relacionadas