小编cha*_*ert的帖子

CMake中的传递RPATH属性

我正在建立一个与一些测试和示例程序捆绑在一起的库。该项目能够兑现cmake属性BUILD_SHARED_LIBS.so如果打开,则构建一个,.a如果关闭,则构建一个文件。该库依赖于其他一些动态库,这些动态库应该使用环境变量来找到LIBLOC(它们的约定,不是我的)。

构建动态版本的库时,可以设置安装rpath以便正确找到库。例如:

add_library(lib ${SRC})
set_target_properties(lib INSTALL_RPATH $LIBLOC)
install(TARGETS lib LIBRARY DESTINATION lib)
Run Code Online (Sandbox Code Playgroud)

然后在每个测试/示例程序的CMakeLists.txt中:

add_executable(test ${SRC})
target_link_libraries(test lib)
set_target_properties(test INSTALL_RPATH $ORIGIN/../lib)
install(TARGETS test RUNTIME bin)
Run Code Online (Sandbox Code Playgroud)

BUILD_SHARED_LIBS是时,测试程序是幸福的:

$ lddtree bin/test
test => bin/test (interpreter => /lib64/ld-linux-x86-64.so.2)
    liblib.so => /path/to/install/liblib.so
        libdep.so => /path/to/dependency/libdep.so
Run Code Online (Sandbox Code Playgroud)

我们可以找到一切,因为在测试中rpath的是$ORIGIN/../lib,它的发现liblib.so,然后将rpath的liblib.so就是$LIBLOC,这是在我的环境设置/path/to/dependency

我本来希望在安装静态库时,cmake INSTALL_RPATH将从我的库中读取该属性并将其放入测试程序中,以便测试中的rpath为$ORIGIN/../lib;$LIBLOC。而是$LIBLOC不会以任何rpath结尾。

我目前的解决方案是不满意:我调节我INSTALL_RPATHBUILD_SHARED_LIBS每个示例或测试程序,如

if (BUILD_SHARED_LIBS)
  set_target_properties(test INSTALL_RPATH "$ORIGIN/../lib")
else () …
Run Code Online (Sandbox Code Playgroud)

cmake

5
推荐指数
1
解决办法
380
查看次数

标签 统计

cmake ×1