cmake中PROJECT_SOURCE_DIR的遐思

本文介绍了在CMake构建系统中,PROJECT_SOURCE_DIR变量的含义及其在项目结构中的作用。当在test目录下执行cmake..时,PROJECT_SOURCE_DIR将指向项目的根目录(test),而取消src子目录中CMakeLists.txt中PROJECT(main)注释后,PROJECT_SOURCE_DIR会变为src子目录路径。这展示了PROJECT_SOURCE_DIR如何根据CMakeLists.txt的位置动态调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PROJECT_SOURCE_DIR为包含PROJECT()的最近一个CMakeLists.txt文件所在的文件夹。
如以下文件结构:

test
   |
   +-----build
   |   
   +-----include   
   |
   +-----lib
   |
   +-----src
              |             
              +main.cpp
              |            
              +CMakeLists.txt   
   |   
   +-----CMakeLists.txt

test/CMakeLists.txt文件内容为
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(test) ADD_SUBDIRECTORY(src)

test/src/CMakeLists.txt文件内容为
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #PROJECT(main)
build中执行cmake ..(两个小数点别丢了)则PROJECT_SOURCE_DIR的值为(parent_path)/test
取消#PROJECT(main)的注释,PROJECT_SOURCE_DIR的值为(parent_path)/test/src.

### CMakeLists.txt 中 `PROJECT_SOURCE_DIR` 和 `PROJECT_ROOT` 的用法和区别 在构建基于 CMake 的项目时,理解变量的作用范围及其含义非常重要。对于 `PROJECT_SOURCE_DIR` 和 `PROJECT_ROOT` 这两个变量: #### PROJECT_SOURCE_DIR 此变量指向当前项目的源码目录路径。当执行 `cmake ..` 或者其他初始化命令时,CMake 自动设置该变量为顶层 CMakeLists.txt 所处的位置。 ```cmake message(STATUS "Project source directory is ${PROJECT_SOURCE_DIR}") ``` 这段代码会打印出项目的根目录位置[^1]。 #### PROJECT_ROOT (注意:这不是标准的 CMake 变量) 实际上,在官方文档中并没有名为 `PROJECT_ROOT` 的预定义变量。如果遇到这个名称,则可能是开发者自定义的一个缓存内部路径或者是误用了应该被替换的标准变量名之一。通常情况下,人们可能混淆了它与 `PROJECT_SOURCE_DIR` 或者 `CMAKE_SOURCE_DIR`。 为了确保清晰性和兼容性,建议始终使用经过验证并广泛接受的内置属性来引用文件夹结构中的特定部分。例如,可以考虑如下替代方案: - 使用 `${CMAKE_CURRENT_SOURCE_DIR}` 来获取当前处理的 CMakeLists.txt 文件所在的目录; - 继续沿用 `${PROJECT_SOURCE_DIR}` 表达整个工程的基础地址; 下面是一个简单的例子展示如何正确应用这些变量: ```cmake project(MyAwesomeProject VERSION 1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_EXTENSIONS OFF) add_executable(${PROJECT_NAME} main.cpp) target_include_directories( ${PROJECT_NAME} PRIVATE "${PROJECT_SOURCE_DIR}/include" ) install(TARGETS ${PROJECT_NAME} DESTINATION bin) install(DIRECTORY include/ DESTINATION include FILES_MATCHING PATTERN "*.h") ``` 在这个案例里,`${PROJECT_SOURCE_DIR}` 被用来指定头文件所在的位置相对于项目起点而言[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值