PROJECT_SOURCE_DIR与CMAKE_CURRENT_SOURCE_DIR

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

上篇文章提到CMake内置变量中的路径目录类变量中PROJECT_SOURCE_DIRCMAKE_CURRENT_SOURCE_DIR对应的路径看了解释也不太理解
在这里插入图片描述

在这里插入图片描述
记录一下


在多子项目CMake工程中,子工程的 PROJECT_SOURCE_DIRCMAKE_CURRENT_SOURCE_DIR 不一定是同一个路径,核心取决于子工程是否通过 project() 命令重新定义了独立项目——这是区分两者的关键。

一、核心规则回顾(多项目场景强化)

  1. CMAKE_CURRENT_SOURCE_DIR:永远指向「当前正在处理的 CMakeLists.txt 所在的源代码目录」(与是否定义子项目无关,纯“文件位置导向”)。
  2. PROJECT_SOURCE_DIR:指向「最近一次执行 project() 命令时定义的项目源代码根目录」(“项目声明导向”,子项目若单独声明 project(),则覆盖父项目的路径)。

二、多子项目结构示例(分两种情况分析)

假设父项目 MyProject 包含两个子工程 SubProjASubProjB,目录结构如下:

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这种情况对应什么结构我没看明白,不应该要么相同,要么上下级关系吗,理解了再来记录下吧,先提交现在这个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值