CMake中${CMAKE_CURRENT_LIST_DIR}与相对路径.的区别是什么
CMake 中
${CMAKE_CURRENT_LIST_DIR}/${CMAKE_CURRENT_SOURCE_DIR} 和相对路径 . 的差异 两者的解析逻辑完全不同:
${CMAKE_CURRENT_SOURCE_DIR}是固定的绝对路径,永远指向当前正在处理的CMakeLists.txt所在的源码目录${CMAKE_CURRENT_LIST_DIR}同样是固定的绝对路径,指向当前正在处理的**任意 .cmake 脚本(包括被include加载的模块)**所在的目录- 而相对路径
.的解析基准会随调用上下文变化,很多场景下和前两个变量的解析结果完全不同
典型差异场景
- 通过
include()加载其他位置的 .cmake 脚本时
比如你在项目根目录的CMakeLists.txt中执行include(cmake/utils.cmake)加载子目录下的工具脚本,此时如果utils.cmake里使用.作为路径,解析基准是调用include的根目录CMakeLists.txt所在的项目根目录;但如果用${CMAKE_CURRENT_LIST_DIR},解析基准是utils.cmake自身所在的cmake目录,两者路径完全不一样。 - 执行独立 CMake 脚本时
如果你用cmake -P运行独立的 CMake 脚本,比如你在/home/xxx目录下执行cmake -P ./tools/backup.cmake,脚本中的.会被解析为执行命令的工作目录/home/xxx,而${CMAKE_CURRENT_LIST_DIR}会被解析为脚本本身所在的/home/xxx/tools目录。 - 需要导出安装目标时
如果你要把目标导出供其他项目引用(用到install(TARGETS ... EXPORT ...)逻辑),如果target_include_directories里用了相对路径.,CMake 在安装阶段会直接报错,提示相对路径不能用于导出目标的包含目录;而使用绝对路径${CMAKE_CURRENT_SOURCE_DIR}就不会有这个问题。
你给出的示例什么时候结果不同?
你举的两个写法:
target_include_directories(foo PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(imgwarp PRIVATE .)
如果这两行代码写在直接被 add_subdirectory() 加载的子目录 CMakeLists.txt 中,且你不需要导出这个目标,那运行结果暂时一致;但只要满足上面三个场景的任意一个,两者执行结果就会完全不同。
内容的提问来源于stack exchange,提问作者QuaternionsRock
相关产品推荐
相关产品推荐

