You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:26:38