Ubuntu 18下CMake配置RUNPATH后部分库搜索路径消失求助
解决Ubuntu 18下CMake配置RUNPATH导致动态库无法找到的问题
问题核心分析
从你提供的readelf输出可以看到,可执行文件的RUNPATH被错误设置为[$ORIGIN/../..lib/]——这是一个无效路径(多了一个.,正确路径应为$ORIGIN/../lib/),这是导致动态链接器后续丢弃该路径、无法找到libHalf-2_3.so.24的根本原因。
CMake中直接写$ORIGIN会被当作变量解析(CMake以$作为变量前缀),如果未定义ORIGIN变量,就会被替换为空字符串,最终导致路径拼接错误。
解决步骤
1. 修正CMake的RUNPATH配置
将原配置中的$ORIGIN转义,避免CMake解析:
# 方法1:用反斜杠转义$ set(CMAKE_INSTALL_RPATH "\$ORIGIN/../lib/") # 方法2:用单引号包裹,跳过CMake变量解析 set(CMAKE_INSTALL_RPATH '$ORIGIN/../lib/')
2. 重新编译验证
- 清理原有构建文件:
rm -rf build && mkdir build && cd build - 重新配置编译:
cmake .. && make && make install - 确认RUNPATH设置正确:
readelf -a my_exe | grep RUNPATH # 预期输出:0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN/../lib/]
3. 验证动态库搜索
运行LD_DEBUG=libs ./my_exe,观察输出中是否会在$ORIGIN/../lib/路径下搜索libHalf-2_3.so.24。如果目录结构符合预期(my_exe在bin/,lib/在上级目录),此时应该能成功找到目标库。
额外调试技巧
如果需要快速验证路径是否正确,可使用chrpath工具临时修改可执行文件的RUNPATH:
chrpath -r '$ORIGIN/../lib/' ./my_exe
修改后直接运行程序,看是否能正常加载所有动态库。
补充说明
确保你的安装目录结构与RUNPATH匹配,比如预期结构应为:
install_root/ ├── bin/ │ └── my_exe └── lib/ ├── libHalf-2_3.so.24 ├── libgmp.so.10 └── libz.so.1
如果目录结构不同(比如my_exe在app/bin/,lib在install_root/lib/),需要调整RUNPATH为$ORIGIN/../../lib/。
内容的提问来源于stack exchange,提问作者Cyril
相关产品推荐
相关产品推荐

