CMake导入库的rpath

3
我有一个已导入的共享库,并通过target_link_libraries进行链接(该库已设置IMPORTED_LOCATION)。但是在安装后,我在ldd输出中看到如下内容:path/on-dev-machine/to/libxxx.so => not found,而不是简单的libxxx.so => path/on-testing-machine/to/libxxx.so。为什么会这样?我将库路径添加到了/etc/ld.so.conf.d。以下是示例代码:
include(GNUInstallDirs)

function(add_and_install_lib lib_name location external_dep)
    if(${location} MATCHES ".*\\.so")
        add_library(${lib_name} SHARED IMPORTED) # MODULE treated as shared
    else()
        add_library(${lib_name} STATIC IMPORTED)
    endif()

    set_property(TARGET ${lib_name} PROPERTY IMPORTED_LOCATION ${location})

    add_dependencies(${lib_name} ${external_dep})
endfunction()


set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_LIBDIR}") # this doesn't seem to help

IMPORTED_LOCATION 只在构建阶段起作用。若要使库在运行时可搜索,请参见CMake RPATH handling - Tsyvarev
@Tsyvarev set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_LIBDIR}") 似乎没有帮助,LD_LIBRARY_PATH 也不行,我猜问题可能是因为 ldd 左边有库的完整路径而非库文件本身。你知道这可能是为什么吗? - ledonter
展示CMake代码。没有代码很难判断路径是否正确。 - Tsyvarev
@Tsyvarev,这是你需要的。 - ledonter
2
你展示的代码没有创建可执行文件,也没有将其与外部库链接,也没有安装它。相反,它定义了一个带有外部库位置参数的函数,人们只能猜测它的值。请提供 [mcve]。此外,您谈论“开发机器上的路径”和“测试机器上的路径”。这是否意味着您在“开发”机器上安装了可执行文件,然后将其复制到“测试”机器上? - Tsyvarev
请问您能否在 add_library 之前设置 RPATH 吗? - mustafagonul
1个回答

5

如果有人在意的话,每个导入库的IMPORTED_NO_SONAME属性(其不存在设置为TRUE)强制采用完整路径。

此外,CMAKE_SKIP_RPATHCMAKE_SKIP_INSTALL_RPATH我认为很有用,可以确保您拥有干净的运行时路径(与问题直接相关但仍然重要)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接