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
相关产品推荐
相关产品推荐

