【问题标题】:Executable missing full library path after build构建后可执行文件缺少完整库路径
【发布时间】:2023-04-05 09:07:02
【问题描述】:

我正在使用 CMake 编译一个可执行文件,该可执行文件与我已构建并安装到本地项目目录 (libs/3rdparty) 的多个库链接。请注意,这是在安装项目之前,主要是为了运行单元测试和调试。我遇到的问题是有时有一个链接的库,但可执行文件缺少库的路径。我目前遇到问题的图书馆是 leptonica。但是,我在不同平台(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。据此,lib 的完整路径应该在目标中。

#----------------------------------------------------------------
# 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 --list test_utilities 的输出似乎也包含正确的库路径:

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

【问题讨论】:

  • Leptonica_LIBRARIES 的值是多少?根据它的值,RPATH 可能是也可能不是您所期望的。参考stackoverflow.com/questions/25378337/…
  • 该值只是“leptonica”,但是 AFAIK 路径应该由 LeptonicaTargets-release.cmake 中定义的目标属性处理。也许他们的 cmake 文件有错误...
  • 添加了上面引用的文件
  • 它在某些地方使用版本5.3.0 而在其他地方使用1.77.0 似乎很奇怪。看起来 ldd 正在寻找 5.3.0 但那不存在。
  • 您在{MY_PROJECT}/libs/3rdparty/leptonica 目录中是否有过libleptonica.so.5.3.0 文件?这应该是链接器用来链接的文件libleptonica.so.1.77.0符号链接。顺便说一句,文件lept.pc 与问题完全无关:find_package(Leptonica) 使用LeptonicaConfig.cmake 一个(以及包含在该脚本中的LeptonicaTargets-release.cmake)。

标签: c++ cmake dynamic-linking


【解决方案1】:

对于遇到此问题的任何人,我终于想通了。

该问题与作为 OpenCV 传递依赖的库有关。在 Ubuntu 上,ld 现在默认使用 --enable-new-dtags,它使用 RUNPATH,而不是 RPATH。存在未在 RUNPATH 中搜索传递依赖项的问题。

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

只需将“-Wl,--disable-new-dtags”添加到目标链接器选项即可解决我的问题。现在找到了所有库,包括我今天添加的除 leptonica 之外的其他库。不过,我确信在构建安装包时可能需要进行更改。

【讨论】:

    猜你喜欢
    • 2014-01-22
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多