【问题标题】:CMake imported library rpathCMake 导入库 rpath
【发布时间】:2018-08-15 19:35:16
【问题描述】:

我有一个 IMPORTED SHARED 库,我通过 target_link_libraries 与它链接(该库设置了 IMPORTED_LOCATION)。

但是在ldd 的输出中安装后,我看到类似:

path/on-dev-machine/to/libxxx.so => not found

而不仅仅是

libxxx.so => path/on-testing-machine/to/libxxx.so

为什么会这样/我该如何解决?我正在将 lib 路径添加到 /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 set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_LIBDIR}") 似乎没有帮助,LD_LIBRARY_PATH 也没有,我想问题在于不知何故有一个完整的 lib 路径而不是 lib 文件本身(在左边=>ldd)。你知道为什么会这样吗?
  • 显示 CMake 代码。没有代码,很难说出路径的正确性。
  • @Tsyvarev 你在这里
  • 您显示的代码不会创建可执行文件,不会将其与外部库链接,也不会安装它。相反,它定义了一个以外部库的位置为参数的函数,人们只能猜测它具有哪个值。请提供minimal reproducible example。另外,您谈到了 path-on-dev-machinepath-on-testing-machine。这是否意味着您将可执行文件安装在“dev”机器上,然后将其复制到“testing”机器?

标签: cmake shared-libraries ld


【解决方案1】:

如果有人关心的话,是每个导入的库的 IMPORTED_NO_SONAME 属性(没有它设置为 TRUE)强制采用完整路径。

在我看来,CMAKE_SKIP_RPATHCMAKE_SKIP_INSTALL_RPATH 也有助于确保您拥有干净的运行时路径(与问题没有直接关系,但仍然如此)。

【讨论】:

    猜你喜欢
    • 2020-10-04
    • 2012-01-14
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多