Скомпилированная программа C ++ вызывает "не удается открыть общий объектный файл" в другой системе, хотя файл присутствует - PullRequest
8 голосов
/ 02 ноября 2010

Я написал крошечную программу, для которой требуются некоторые библиотеки, включая libboost_filesystem, libboost_program_options и libcurl.

Я скомпилировал ее на своем домашнем компьютере и взял двоичный файл на свой компьютер на работе, чтобы проверить его там.Но там при попытке запустить программу выдается следующее сообщение об ошибке:

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

Но когда я ищу этот файл, я вижу, что он существует в: /usr/lib/libboost_filesystem.so.1.42.0

Что-то не так во время компиляции / компоновки моей программы?Если да, что мне нужно сделать, чтобы это работало на других машинах?

Ответы [ 6 ]

7 голосов
/ 02 ноября 2010

Сначала попробуйте ввести в консоли ldconfig -p | grep libboost_filesystem.so, чтобы убедиться, что библиотека находится в вашем кэше ld.

Если это не так, вам может потребоваться добавить файл с именем, например boost.conf в каталог / etc / ld.so.conf.d .Этот файл должен содержать путь к вашим буст-библиотекам.Затем запустите sudo ldconfig, чтобы обновить ld-кеш вашей системы.

Надеюсь, это поможет ...

1 голос
/ 02 ноября 2010

является / usr / lib в вашей переменной среды LD_LIBRARY_PATH?

1 голос
/ 02 ноября 2010

Не могли бы вы убедиться, что /usr/lib/libboost_filesystem.so.1.42.0 не является мертвой ссылкой?

1 голос
/ 02 ноября 2010

Вы ссылались на одну и ту же версию библиотеки boost_filesystem?В зависимости от того, как вы компилируете свое приложение, требуется наличие одной и той же версии библиотеки.

Вы можете попытаться проверить, что приложение действительно ищет:Возможно, проверьте и вашу переменную окружения LD_LIBRARY_PATH.

1 голос
/ 02 ноября 2010

Похоже, вам нужно статически связать библиотеку.Вот хорошее объяснение. Повышение статической связи

1 голос
/ 02 ноября 2010

Вы скомпилировали общие двоичные файлы boost и предоставили их пользователю?

Часто boost может использоваться без какого-либо двоичного / общего доступа. Но если вы используете, например, boost :: filesystem, вам нужно будет скомпилировать двоичные файлы, как lib или разделяемый объект, и убедиться, что они доступны для конечного исполняемого пути общего двоичного поиска.

Вы можете найти объяснение и более подробную информацию в документации повышения. Вот версия для Linux: http://www.boost.org/doc/libs/1_44_0/more/getting_started/unix-variants.html

С этой страницы:

Большинство библиотек Boost предназначены только для заголовков: они состоят исключительно из заголовочных файлов содержащие шаблоны и встроенные функции и не требуют раздельно скомпилированные библиотеки или особый режим при связывании.

...

Единственные библиотеки Boost, которые должны быть построены отдельно:

  • Boost.Filesystem
  • Boost.GraphParallel
  • Boost.IOStreams
  • Boost.MPI
  • Boost.ProgramOptions
  • Boost.Python (см. документация по сборке Boost.Python перед сборкой и установкой)
  • Boost.Regex
  • Boost.Serialization
  • Boost.Signals
  • Boost.System
  • Boost.Thread
  • Boost.Wave
...