Исполняемому файлу не хватает полного пути к библиотеке после сборки - PullRequest
1 голос
/ 30 мая 2019

Я использую CMake для компиляции исполняемого файла, который связан с несколькими библиотеками, которые я собрал и установил в локальный каталог проекта (libs / 3rdparty).Обратите внимание, что это до установки проекта, в первую очередь для запуска модульных тестов и отладки.У меня проблема в том, что иногда есть библиотека, которая связана, но исполняемый файл не хватает пути к библиотеке.Библиотека, с которой у меня сейчас проблема, - это лептоника.Однако я сталкивался с этой проблемой несколько раз с разными библиотеками на разных платформах (osx, fedora, centos, ubuntu).В ходе исследований я обнаружил похожие проблемы, но мне так и не удалось найти однозначного ответа о том, почему будет отсутствовать полный путь к библиотеке.

Я пытался поиграть:

CMAKE_BUILD_WITH_INSTALL_RPATH
CMAKE_INSTALL_RPATH
CMAKE_INSTALL_RPATH_USE_LINK_PATH

и это, кажется, не имеет большого эффекта.

Мои CMakeLists содержат:

find_package(Leptonica REQUIRED)

target_link_libraries(${target}
    PRIVATE
        ...
        ${Leptonica_LIBRARIES}
)

Вот вывод ldd для одного из исполняемых файлов модульного теста:

ldd test_utilities
...
libleptonica.so.5.3.0 => not found
libtesseract.so.4 => {MY PROJECT}/libs/3rdparty/tesseract/lib/libtesseract.so.4

leptonica - единственная библиотека, которая не являетсянайдено из ~ 30 других библиотек.

Кто-нибудь знает, что является основной причиной этой проблемы?Я не пытаюсь обойти эту проблему, изменив LD_LIBRARY_PATH.

- Добавлен LeptonicaTargets-release.cmake.В соответствии с этим в папке должен быть указан полный путь к библиотеке.

#----------------------------------------------------------------
# Generated CMake target import file for configuration "RELEASE".
#----------------------------------------------------------------

# Commands may need to know the format version.
set(CMAKE_IMPORT_FILE_VERSION 1)

# Import target "leptonica" for configuration "RELEASE"
set_property(TARGET leptonica APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(leptonica PROPERTIES
  IMPORTED_LINK_INTERFACE_LIBRARIES_RELEASE "/usr/lib/x86_64-linux-gnu/libpng.so;/usr/lib/x86_64-linux-gnu/libz.so;m"
  IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libleptonica.so.1.77.0"
  IMPORTED_SONAME_RELEASE "libleptonica.so.5.3.0"
  )

list(APPEND _IMPORT_CHECK_TARGETS leptonica )
list(APPEND _IMPORT_CHECK_FILES_FOR_leptonica "${_IMPORT_PREFIX}/lib/libleptonica.so.1.77.0" )

# Commands beyond this point should not need to know the version.
set(CMAKE_IMPORT_FILE_VERSION)

Вот файлы в каталоге leptonica / lib:

ll libs/3rdparty/leptonica/lib/ 
total 2776
drwxr-xr-x 3 user user    4096 May 30 14:17 ./
drwxr-xr-x 5 user user    4096 May 30 14:17 ../
lrwxrwxrwx 1 user user      21 May 30 14:17 libleptonica.so -> libleptonica.so.5.3.0
-rw-r--r-- 1 user user 2829784 May 30 09:49 libleptonica.so.1.77.0
lrwxrwxrwx 1 user user      22 May 30 14:17 libleptonica.so.5.3.0 -> libleptonica.so.1.77.0
drwxr-xr-x 2 user user    4096 May 30 14:17 pkgconfig/

Вывод из chrpath --listtest_utilities также содержит правильный путь к библиотеке:

chrpath --list test_utilities
test_utilities: RUNPATH=...:{MY PROJECT}/libs/3rdparty/leptonica/lib:...

1 Ответ

0 голосов
/ 31 мая 2019

Для всех, кто сталкивался с этим, я наконец-то понял это.

Проблема была связана с тем, что библиотека была транзитивной зависимостью OpenCV.В Ubuntu ld теперь по умолчанию использует --enable-new-dtags, который использует RUNPATH, а не RPATH.Существует проблема, при которой в RUNPATH не выполняется поиск транзитивных зависимостей.

См. https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/1253638

Простое добавление "-Wl, - disable-new-dtags" к параметрам целевого компоновщика решило мою проблему.вопрос.Все библиотеки теперь найдены, включая другие, кроме leptonica, которые я добавил сегодня.Я уверен, что мне, вероятно, придется вносить изменения при сборке пакета для установки.

...