在CMAKE中指定运行时和构建时依赖项

时间:2018-07-04 14:36:52

标签: cmake shared-libraries ldd

我正在使用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时,我可以看到libary正在构建机器上的目录中寻找api.so,但是我想强制库在运行时向上一级查找它,在../api.so中也是如此。

我不在乎是使用相对路径还是绝对路径,但是它必须位于我用来在计算机上进行链接的位置之外的其他位置。我不要使用LD_LIBRARY_PATH,解决方案应该在CMAKE脚本中完成。

我发现到目前为止并尝试过:

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

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

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

您能告诉我使用什么CMAKE命令来解决此问题吗?我在做错什么吗?

2 个答案:

答案 0 :(得分:0)

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

要传播内置库的这些设置,请设置CMAKE_BUILD_WITH_INSTALL_RPATH变量:

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

add_library(...)

答案 1 :(得分:0)

我不得不自己寻找一些解决方案,因为距我发布问题已有很长时间了。也许这是一种解决方法,我不知道,我没有找到更好的解决方案,它有效。

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

我决定在/ usr / lib 中创建具有共享库目录的符号链接,我需要与我的库链接。因此,服务器和构建机器上存在相同的符号链接,但指向库的位置不同。