Ситуация
Мой проект использует CMake и без проблем компилируется в Ubuntu 16.04.
При запуске скомпилированного приложения я получаю сообщение не удается открыть общий объектный файл.
Все библиотеки общих объектов доступны в одной нестандартной папке (и они мне там нужны).
- Почему-то одни можно найти, а другие нет.
Что мне нужно
- Причина, по которой некоторые общие объекты могут быть найдены, а другие нет. Проект довольно большой со многими файлами CMake. Я пытался найти различия между загружаемыми и не загружаемыми библиотеками, но безуспешно. Любая помощь, которая укажет мне нужное место, приветствуется.
- Решение внутри CMake, позволяющее найти все общие объекты.
лдд
Вывод ldd показывает, что можно найти большинство общих объектов. Вот некоторые примеры:
libboost_filesystem.so.1.55.0 => /path/to/libs/boost/lib/libboost_filesystem.so.1.55.0 (0x00007f2ed1fa0000)
libboost_filesystem.so.1.55.0 => /path/to/libs/boost/lib/libboost_filesystem.so.1.55.0 (0x00007f96af1f5000)
libboost_program_options.so.1.55.0 => /path/to/libs/boost/lib/libboost_program_options.so.1.55.0 (0x00007f96aef85000)
libboost_system.so.1.55.0 => /path/to/libs/boost/lib/libboost_system.so.1.55.0 (0x00007f96aed80000)
Некоторых других почему-то не найти. Например:
libboost_iostreams.so.1.55.0 => not found
libboost_chrono.so.1.55.0 => not found
Есть и другие библиотеки, не поддерживающие ускорение, которые демонстрируют такое же поведение, но для простоты я просто показываю примеры повышения.
Обходные пути уже опробованы
Ниже приведены обходные пути, которые уже успешно работают. Но меня действительно интересуют два пункта в разделе Что мне нужно.
- Копирование в стандартные папки, такие как /usr/lib, и запуск ldconfig
- Добавление пути к LD_LIBRARY_PATH
This is what I tried already...
- Помогло или нет? Если проблема связана с RPATH, которую можно исправить с помощью LD_LIBRARY_PATH, тогда CMake также поддерживает RPATH, см. обработка CMake RPATH. - person Tsyvarev   schedule 30.12.2016libboost_chrono.so.1.55.0
в вашей системе и где? - person cen   schedule 30.12.2016libboost_chrono.so.1.55.0
и все остальные библиотеки Boost находятся в/path/to/libs/boost/lib/
. Как упоминалось в вопросе, их также можно загрузить при добавлении пути к переменной среды LD_LIBRARY_PATH. - person mz1000   schedule 30.12.2016SET(CMAKE_SKIP_BUILD_RPATH FALSE)
. Результат все тот же, какие-то либы находят, какие-то нет. Я также пытался проверить с помощьюobjdump
. Ничего связанного с RPATH нет. Однако он показал RUNPATH со всеми правильными путями. - person mz1000   schedule 30.12.2016