2010-11-02 10 views
8

Escribí un pequeño programa que requiere algunas bibliotecas como libboost_filesystem, libboost_program_options y libcurl.El programa compilado de C++ plantea "no se puede abrir el archivo de objeto compartido" en otro sistema aunque el archivo está presente

Lo compilé en la máquina de mi casa y tomé el binario de mi computadora en el trabajo para probarlo allí. Pero no da la siguiente mensaje de error cuando trato de iniciar el programa:

error while loading shared libraries: 
libboost_filesystem.so.1.42.0: cannot 
open shared object file 

Pero cuando la búsqueda de este archivo veo que existe en: /usr/lib/libboost_filesystem.so.1.42.0

¿Hice algo mal durante la compilación/vinculación de mi programa? En caso afirmativo, ¿qué debo hacer para que funcione en otras máquinas?

+1

A menudo me parece que 'ldd' puede ayudarme a descubrir cuál es el problema. ¿Qué dice 'ldd./Your_executable'? –

+1

Por lo que ha dicho, parece que debería estar funcionando. Puede haber un conflicto de 32 bits frente a 64 bits. Intenta ejecutar 'file./Your_executable' y' file/usr/lib/libboost_filesystem.so.1.42.0' para verificar que las arquitecturas coincidan :) –

+1

wow tienes razón. el programa está construido como 32 bits y la biblioteca presente es 64bit – tyrondis

Respuesta

1

¿Compiló los binarios compartidos de boost y se los proporcionó al usuario?

A menudo se puede utilizar boost sin ningún tipo de binario/compartido para proporcionar. Pero si usa, por ejemplo, boost :: filesystem, tendrá que compilar los binarios, como lib u objeto compartido, y asegurarse de que esté disponible para la ruta de búsqueda binaria compartida ejecutable final.

Puede encontrar una explicación y más detalles en la documentación de impulso. Esta es la versión para Linux: http://www.boost.org/doc/libs/1_44_0/more/getting_started/unix-variants.html

Desde esta página:

mayoría de las bibliotecas Boost son sólo de encabezado: que consisten en su totalidad de los archivos de cabecera plantillas que contienen y en línea funciones, y no requieren separado- compilar los binarios de la biblioteca o un tratamiento especial al vincular.

...

Las únicas bibliotecas Boost que deben estar construyeron por separado son:

  • Boost.Filesystem
  • Boost.GraphParallel
  • Boost.IOStreams
  • Boost.MPI
  • Boost.ProgramOptions
  • Boost.Python (véase la Boost.Python construir documentación antes de construir e instalarlo)
  • Boost.Regex
  • Boost.Serialization
  • Boost.Signals
  • Boost. sistema
  • Boost.Thread
  • Boost.Wave
+0

¿Podría explicar esto con más detalles, por favor? ¿O llevarme a algún recurso? Soy bastante nuevo en el desarrollo de Linux y no sé mucho al respecto. – tyrondis

+0

Estoy agregando un enlace a documentación más precisa sobre eso. Hecho. – Klaim

1

Parece que necesita vincular estáticamente la biblioteca. Aquí hay una buena explicación.Boost static linking

+1

está bien, pero si los enlace estáticamente, ¿no perderé el beneficio de tener dependencias con las bibliotecas compartidas? Pensé que sería la forma "estándar" bajo Linux – tyrondis

1

¿Tuvo un enlace contra la misma versión de la biblioteca boost_filesystem? Dependiendo de cómo compile su aplicación, requiere la misma versión de la biblioteca para estar presente.

Se podría tratar de comprobar lo que su aplicación en la práctica busca con:

ldd <your app name> 

Probablemente comprobar la variable de entorno LD_LIBRARY_PATH también.

+0

LLD me dio \t libboost_filesystem.so.1.42.0 => No se ha encontrado \t libboost_program_options.so.1.42.0 => No se ha encontrado \t libboost_system.so.1.42. 0 => no encontrado – tyrondis

1

¿Podría asegurarse de que /usr/lib/libboost_filesystem.so.1.42.0 no es un enlace muerto?

7

Primero, intente emitir ldconfig -p | grep libboost_filesystem.so en una consola para asegurarse de que la biblioteca está en su caché ld.

Si no es así, puede que tenga que añadir un archivo con un nombre como boost.conf a su directorio /etc/ld.so.conf.d. Este archivo debe contener una ruta a tus bibliotecas de impulso. Luego ejecute sudo ldconfig para actualizar la memoria caché ld de su sistema.

Esperamos que esto ayude ...

+1

thx, parece una buena manera de hacerlo. Tal vez estándar? – unludo

1

es/usr/lib en la variable de entorno LD_LIBRARY_PATH?

Cuestiones relacionadas