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

CMake中$ORIGIN令牌是什么?如何使用?

关于$ORIGIN令牌与CMake BUILD_RPATH_USE_ORIGIN的详解

什么是$ORIGIN?

$ORIGIN是类Unix系统(Linux、macOS等)动态链接器(如ld.so)支持的特殊路径令牌,它会被动态链接器解析为当前可执行文件(或共享库)所在的绝对目录路径。

动态链接器加载程序依赖的共享库时,会自动将$ORIGIN替换为程序实际运行时的所在目录,从而实现基于程序位置的相对路径查找,无需依赖系统环境变量(如LD_LIBRARY_PATH)或硬编码绝对路径。

和CMake BUILD_RPATH_USE_ORIGIN的关系

CMake的BUILD_RPATH_USE_ORIGIN是目标属性,作用是允许在目标的BUILD_RPATH中安全使用$ORIGIN令牌,并自动处理不同构建系统的转义需求(比如在Makefile中会将$ORIGIN转义为\$ORIGIN,避免被shell提前解析)。

当开启该属性后,你可以在BUILD_RPATH中直接使用$ORIGIN定义相对路径,CMake会确保生成的构建文件能正确传递这个令牌给动态链接器。

使用示例

假设你的项目结构是:

my_project/
├── build/
│   ├── bin/
│   │   └── my_app  # 生成的可执行文件
│   └── lib/
│       └── libmydep.so  # 依赖的共享库
└── src/
    └── main.cpp

你可以通过以下CMake代码配置,让my_app运行时自动从同目录的lib子文件夹查找依赖:

add_executable(my_app src/main.cpp)

# 启用BUILD_RPATH_USE_ORIGIN属性
set_target_properties(my_app PROPERTIES
    BUILD_RPATH_USE_ORIGIN ON
    # 定义RPATH为可执行文件所在目录下的lib文件夹
    BUILD_RPATH "$ORIGIN/lib"
)

# 链接依赖库
target_link_libraries(my_app PRIVATE mydep)

注意事项

  • $ORIGIN仅在类Unix系统生效:macOS下CMake会自动将$ORIGIN映射为系统原生的@executable_path令牌,行为一致;Windows系统无此令牌,对应逻辑需用%~dp0等Windows原生方式处理。
  • 需确保系统动态链接器支持:较新版本的ld.so(Linux)都支持$ORIGIN,无需额外配置。

内容的提问来源于stack exchange,提问作者Thomas Fritz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:46:23