如何阻止CMake将库导出目录添加至可执行文件的RPath
解决CMake自动添加库构建路径到RPATH的问题
我来帮你搞定这个CMake RPATH的问题——你碰到的是CMake的默认行为:它会自动把依赖库的构建输出路径加到可执行文件的RPATH里,方便调试阶段直接运行程序,但这确实会干扰你想要的$ORIGIN/.路径设置。这里有两种实用的解决方法:
方法一:全局禁用自动构建RPATH
在你的主CMakeLists.txt里添加这两行配置,直接关掉CMake自动添加构建路径到RPATH的功能:
# 禁止CMake自动将依赖库的构建路径添加到RPATH set(CMAKE_SKIP_BUILD_RPATH TRUE) # 保证安装阶段的RPATH设置不受影响(如果后续需要安装程序的话) set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
这样全局设置后,你之前指定的CMAKE_BUILD_RPATH $ORIGIN/.就能正常生效,不会被自动添加的路径干扰。
方法二:针对单个目标单独配置(更推荐)
如果你不想全局修改,只想给特定的可执行文件设置RPATH,可以在src目录的CMakeLists.txt里,给test这个可执行目标单独配置:
add_library(testlib SHARED inlib.cpp) add_executable(test main.cpp) # 给test目标禁用自动添加构建路径到RPATH的功能 set_target_properties(test PROPERTIES SKIP_BUILD_RPATH TRUE) # 为test目标设置你需要的自定义RPATH set_target_properties(test PROPERTIES BUILD_RPATH "$ORIGIN/.") target_link_libraries(test testlib)
这种方式更灵活,不会影响项目里其他目标的RPATH设置。
验证方法
修改完CMake配置后,重新构建项目,然后用下面的命令查看可执行文件的RPATH:
readelf -d bin/release/test | grep RPATH
正常情况下,输出里应该只会看到$ORIGIN/.,而不会再出现/home/?????/test/lib/release这类自动添加的路径了。
内容的提问来源于stack exchange,提问作者trBlueJ
相关产品推荐
相关产品推荐

