提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
上篇文章提到CMake内置变量中的路径目录类变量中PROJECT_SOURCE_DIR与CMAKE_CURRENT_SOURCE_DIR对应的路径看了解释也不太理解


记录一下
在多子项目CMake工程中,子工程的 PROJECT_SOURCE_DIR 与 CMAKE_CURRENT_SOURCE_DIR 不一定是同一个路径,核心取决于子工程是否通过 project() 命令重新定义了独立项目——这是区分两者的关键。
一、核心规则回顾(多项目场景强化)
CMAKE_CURRENT_SOURCE_DIR:永远指向「当前正在处理的CMakeLists.txt所在的源代码目录」(与是否定义子项目无关,纯“文件位置导向”)。PROJECT_SOURCE_DIR:指向「最近一次执行project()命令时定义的项目源代码根目录」(“项目声明导向”,子项目若单独声明project(),则覆盖父项目的路径)。
二、多子项目结构示例(分两种情况分析)
假设父项目 MyProject 包含两个子工程 SubProjA 和 SubProjB,目录结构如下:
MyProject/ # 父项目根目录(顶级CMakeLists.txt在此)
├── CMakeLists.txt # 父项目CMakeLists.txt(声明 project(MyProject))
├── SubProjA/ # 子工程A(独立项目,有自己的 project())
│ ├── CMakeLists.txt # 子A的CMakeLists.txt(含 project(SubProjA))
│ └── src/
└── SubProjB/ # 子工程B(非独立项目,无自己的 project())
├── CMakeLists.txt # 子B的CMakeLists.txt(无 project() 命令)
└── src/
父项目 MyProject/CMakeLists.txt 核心内容(用于添加子工程):
project(MyProject) # 父项目声明,PROJECT_SOURCE_DIR = MyProject根目录
add_subdirectory(SubProjA) # 引入子工程A(会执行 SubProjA/CMakeLists.txt)
add_subdirectory(SubProjB) # 引入子工程B(会执行 SubProjB/CMakeLists.txt)
三、两种子工程场景对比
场景1:子工程有独立 project() 声明(如 SubProjA)
SubProjA/CMakeLists.txt 内容:
project(SubProjA) # 子工程单独声明项目
# 此时打印两个变量
message("SubProjA - CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
message("SubProjA - PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
输出结果(路径以实际系统为例):
SubProjA - CMAKE_CURRENT_SOURCE_DIR: /home/user/MyProject/SubProjA
SubProjA - PROJECT_SOURCE_DIR: /home/user/MyProject/SubProjA
结论:此时两者是同一个路径!
原因:子工程A通过 project(SubProjA) 重新声明了项目,PROJECT_SOURCE_DIR 被更新为子工程A的根目录;而 CMAKE_CURRENT_SOURCE_DIR 本身就是子A的 CMakeLists.txt 所在目录,因此两者一致。
场景2:子工程无独立 project() 声明(如 SubProjB)
SubProjB/CMakeLists.txt 内容:
# 无 project() 命令,继承父项目的 project 声明
# 此时打印两个变量
message("SubProjB - CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
message("SubProjB - PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
输出结果:
SubProjB - CMAKE_CURRENT_SOURCE_DIR: /home/user/MyProject/SubProjB
SubProjB - PROJECT_SOURCE_DIR: /home/user/MyProject
结论:此时两者不是同一个路径!
原因:子工程B未声明自己的 project(),PROJECT_SOURCE_DIR 沿用最近一次(父项目)的声明,即父项目 MyProject 的根目录;而 CMAKE_CURRENT_SOURCE_DIR 仍指向子B的 CMakeLists.txt 所在目录,因此两者不同。
四、关键总结
| 子工程特征 | PROJECT_SOURCE_DIR 指向 | CMAKE_CURRENT_SOURCE_DIR 指向 | 两者是否同路径? |
|---|---|---|---|
有独立 project() 声明 | 子工程自身的源代码根目录 | 子工程的 CMakeLists.txt 所在目录 | 是 |
无独立 project() 声明 | 父项目(最近一次 project())的根目录 | 子工程的 CMakeLists.txt 所在目录 | 否 |
简单记:子工程是否“独立”(用 project() 声明)决定了 PROJECT_SOURCE_DIR 的指向,而 CMAKE_CURRENT_SOURCE_DIR 永远“忠于”当前 CMakeLists.txt 的位置。
总结
本质就是子工程有没有使用project() 声明,但是
这个图里面/home/user/project/submodule与/home/user/project/src这种情况对应什么结构我没看明白,不应该要么相同,要么上下级关系吗,理解了再来记录下吧,先提交现在这个
7912

被折叠的 条评论
为什么被折叠?



