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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:54:03