C++ 生成后可执行文件缺少完整的库路径

C++ 生成后可执行文件缺少完整的库路径,c++,cmake,dynamic-linking,C++,Cmake,Dynamic Linking,我正在使用CMake编译一个可执行文件,该文件与我构建并安装到本地项目目录(libs/3rdparty)中的几个库相链接。请注意,这是在安装项目之前,主要是为了运行单元测试和调试。我遇到的问题是,有时有一个链接的库,但可执行文件缺少指向该库的路径。我目前遇到问题的图书馆是leptonica。然而,我在不同平台(osx、fedora、centos、ubuntu)上的不同库中多次遇到这个问题。通过研究,我看到了类似的问题,但我始终无法找到通往图书馆的完整路径为何会丢失的确切答案 我试过玩: CMAK

我正在使用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_路径来解决这个问题

--添加了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_实用程序的输出似乎也包含到库的正确路径:

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

对于任何遇到这个问题的人,我终于找到了答案

该问题与库是OpenCV的可传递依赖项有关。在Ubuntu上,ld现在默认使用using--enable新的dtags,它使用的是RUNPATH,而不是RPATH。存在一个问题,运行路径没有搜索可传递依赖项


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

对于遇到此问题的任何人,我终于找到了答案

该问题与库是OpenCV的可传递依赖项有关。在Ubuntu上,ld现在默认使用using--enable新的dtags,它使用的是RUNPATH,而不是RPATH。存在一个问题,运行路径没有搜索可传递依赖项


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

Leptonica_库的价值是什么?根据它的值,RPATH可能是您所期望的,也可能不是。请参阅。该值仅为“leptonica”,但是,请确认路径应由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)
使用
leptonicanfig.cmake
one(以及
LeptonicaTargets release.cmake
,它包含在该脚本中)。Leptonica_库的值是多少?根据它的值,RPATH可能是您所期望的,也可能不是。请参阅。该值仅为“leptonica”,但是,请确认路径应由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_包(Leptonica)
使用
LeptonicaConfig.cmake
one(以及
LeptonicaTargets release.cmake
,它包含在该脚本中)。