【问题标题】:Specify run-time and build-time dependency in CMAKE在 CMAKE 中指定运行时和构建时依赖项
【发布时间】:2018-07-04 14:36:51
【问题描述】:

我正在使用 CMAKE 构建共享库camera,它依赖于api.so,它也是共享库。库camera.soserver 可执行文件使用,我在linux 上。

我在 ~/projects/server/camera/build 中有 CMAKE 构建目录。

生产环境的服务器结构如下:

  • /opt/server
    • server
    • api.so
    • /lib/
      • camera.so

我有以下 CMAKE 脚本:

SET(LIB_DIR ${PROJECT_SOURCE_DIR}/lib/Release)
ADD_LIBRARY(api SHARED IMPORTED)
SET_PROPERTY(TARGET api PROPERTY IMPORTED_LOCATION ${LIB_DIR}/api.so)
TARGET_LINK_LIBRARIES(camera
        api
)

变量PROJECT_SOURCE_DIR 包含~/projects/server

我需要使用IMPORTED_LOCATION,因为api.so 库名称不以lib 开头,对此我无能为力,它正在工作。

我成功构建了camera.so,然后我将它放在生产服务器上的/opt/server/lib 目录下。当我运行ldd /opt/server/lib/camera.so 时,我可以看到库正在我在构建机器上拥有它的目录中寻找api.so,但我想强制库在运行时向上一级寻找它,所以在@987654341 @。

我不在乎是使用相对路径还是绝对路径,但它需要位于我使用它在我的计算机上链接的位置以外的其他地方。我不想用LD_LIBRARY_PATH,应该在CMAKE脚本中解决。

到目前为止我找到并尝试了:

SET(CMAKE_INSTALL_RPATH "@executable_path/../")

SET(CMAKE_INSTALL_RPATH "$ORIGIN/../")

ldd 仍然一直告诉我它正在寻找我的构建目录,而该目录在生产中不存在。

你能告诉我应该使用什么 CMAKE 命令来解决这个问题吗?我做错了吗?

【问题讨论】:

    标签: cmake shared-libraries ldd


    【解决方案1】:

    变量CMAKE_INSTALL_RPATH 影响已安装 库的RPATH(使用install() 命令)。

    要为构建的库传播这些设置,请设置 CMAKE_BUILD_WITH_INSTALL_RPATH 变量:

    set(CMAKE_INSTALL_RPATH "$ORIGIN/../")
    set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
    
    add_library(...)
    

    【讨论】:

    • 我明白了,这可能是原因。我不在办公室,我会在星期一回来,然后我试试看。如果可行,我会将答案标记为已接受。我现在能想到的唯一问题是我们在 ubuntu 14.04 上运行,那里是旧的 CMAKE 版本,它会比 2.xx 旧。你知道 CMAKE_BUILD_WITH_INSTALL_RPATH 是在哪个 CMAKE 版本中引入的吗?
    • 您可以随时访问 CMake documentation page 并查看特定 CMake 版本的文档。
    • 它对我不起作用。我添加了您建议的两行,然后尝试使用 2.8.12.2 (ubuntu 14) 和 3.5.1 (ubuntu 16) CMAKE 版本。我删除了build目录的所有内容,运行cmake -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo ..,然后运行make -j4。当我在创建的二进制文件上运行ldd camera.so 时,我可以看到它仍在我的构建目录中寻找api.so
    【解决方案2】:

    我必须自己找到一些解决方案,因为我发布问题已经有一段时间了。也许这是解决方法,我不知道,我没有找到更好的解决方案,它有效。

    Tsyvarev 提出的解决方案适用于在同一个 Cmake 项目中构建的库,但不适用于其他人构建的库,这是我的情况。

    我决定创建 symlink in /usr/lib 到包含我需要与我的库链接的共享库的目录。所以服务器和我的构建机器上有相同的符号链接,但指向不同的库位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 2013-04-25
      • 2020-04-03
      相关资源
      最近更新 更多