CMAKE_CURRENT_SOURCE_DIR
、CMAKE_SOURCE_DIR
、PROJECT_SOURCE_DIR
在 CMake
中,CMAKE_CURRENT_SOURCE_DIR
、CMAKE_SOURCE_DIR
和 PROJECT_SOURCE_DIR
是用于指定源文件路径的变量。
1. CMAKE_CURRENT_SOURCE_DIR
:
- 定义:表示当前
CMakeLists.txt
文件所在的目录路径。 - 用途:当你在根目录中调用
add_subdirectory
时,这个变量指向子目录的路径,而不是根目录。用于指定当前目录相关的路径。 - 示例:如果你的项目结构如下:
/project
CMakeLists.txt
/src
CMakeLists.txt
在 /project/src/CMakeLists.txt
中,CMAKE_CURRENT_SOURCE_DIR
的值是 /project/src
。
2. CMAKE_SOURCE_DIR
:
- 定义:表示整个项目的源目录,即顶层
CMakeLists.txt
文件所在的目录路径。 - 用途:用于在整个项目中引用顶层目录的路径,而不论你当前在什么子目录中。
- 示例:对于上面的项目结构,无论你在
src
目录还是其他子目录中,CMAKE_SOURCE_DIR
的值始终是/project
。
3. PROJECT_SOURCE_DIR
:
- 定义:表示当前
CMake
项目的源目录路径,等同于CMAKE_SOURCE_DIR
,但仅在项目被定义后才会被赋值。 - 用途:主要用于引用顶层目录的路径,与
CMAKE_SOURCE_DIR
的用法相同。PROJECT_SOURCE_DIR
仅在调用project()
函数后才会被正确赋值。 - 示例:如果项目结构和上面的示例相同,
PROJECT_SOURCE_DIR
的值也是/project
,在调用project()
函数后即可使用。
# In /project/CMakeLists.txt
project(MyProject)
message("Project source dir: ${PROJECT_SOURCE_DIR}")
总结
CMAKE_CURRENT_SOURCE_DIR
:指向当前CMakeLists.txt
所在的目录。CMAKE_SOURCE_DIR
:指向顶层CMakeLists.txt
所在的目录。- PROJECT_SOURCE_DIR:指向顶层
CMakeLists.txt
所在的目录,但在调用project()
函数之前不一定有效。
CMAKE_CURRENT_BINARY_DIR
、CMAKE_BINARY_DIR
、PROJECT_BINARY_DIR
CMAKE_CURRENT_BINARY_DIR
、CMAKE_BINARY_DIR
和 PROJECT_BINARY_DIR
是 CMake
中与构建目录相关的变量。它们与之前提到的源目录相关的变量(如 CMAKE_SOURCE_DIR
和 PROJECT_SOURCE_DIR
)的主要区别在于它们指向的是构建目录而不是源目录。
1. CMAKE_CURRENT_BINARY_DIR
:
- 定义:表示当前正在处理的
CMakeLists.txt
文件所在的构建目录。换句话说,它指向当前处理的CMakeLists.txt
文件的构建目录路径。 - 用途:
局部构建目录路径:在多层级项目中,尤其是在子目录中的CMakeLists.txt
文件中,你可以使用CMAKE_CURRENT_BINARY_DIR
来指代当前子目录的构建目录。
生成文件路径:如果你在子目录中需要生成特定的文件或目录,你可以使用CMAKE_CURRENT_BINARY_DIR
来指定路径,以确保在正确的构建目录中操作。
2. CMAKE_BINARY_DIR
:
- 定义:表示
CMake
的当前构建目录,即执行cmake
命令时指定的构建目录的路径。 - 用途:用于指向
CMake
配置的构建目录。它是顶层CMakeLists.txt
文件所在的构建目录。 - 示例:假设你在
/project/build
目录中运行CMake
,CMAKE_BINARY_DIR
将是/project/build
。
3. PROJECT_BINARY_DIR
:
- 定义:表示当前项目的构建目录路径。在调用
project()
函数后设置,通常等同于CMAKE_BINARY_DIR
,但仅在项目被定义后才会有效。 - 用途:用于指向当前项目的构建目录。它与
CMAKE_BINARY_DIR
相同,但在项目定义之前可能不会设置。 - 示例:如果你的项目在
/project/build
目录中构建,那么PROJECT_BINARY_DIR
的值也是/project/build
,前提是project()
函数已经调用。
比较
- 源目录变量(如
CMAKE_CURRENT_SOURCE_DIR
和CMAKE_SOURCE_DIR
)指向源代码的位置,而 构建目录变量(如CMAKE_BINARY_DIR
和PROJECT_BINARY_DIR
)指向构建结果所在的目录。 CMAKE_BINARY_DIR
和PROJECT_BINARY_DIR
主要用于处理构建目录中的文件,如构建生成的目标文件、临时文件和其他构建输出。CMAKE_CURRENT_SOURCE_DIR
和CMAKE_SOURCE_DIR
用于指向源代码文件的位置,通常用于查找源文件、头文件等。