CMake中PROJECT_SOURCE_DIR与PROJECT_BINARY_DIR的区别

4,691 阅读1分钟

PROJECT_SOURCE_DIR与PROJECT_BINARY_DIR并不像一些网站上说的是一样的,两者并不相同。首先看一下官方对两者的定义:

PROJECT_SOURCE_DIR
Top level source directory for the current project.
This is the source directory of the most recent project() command.
PROJECT_BINARY_DIR
Full path to build directory for project.
This is the binary directory of the most recent project() command.

这个解释不是很好懂,结合一个例子说明下。比如一个工程目录结构如下:

project
|   CMakeLists.txt
|   source1.cxx

CMakeLists.txt内容如下:

cmake_minimum_required (VERSION 3.0)
project (myProject)
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
    message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
add_executable (t1 source1.cxx)

如果在CMakeLists.txt所在的目录运行cmake . 的话,可以看到两个变量的值分别为:

PROJECT_SOURCE_DIR=C:/Codebase/Learnings/camkelearn3
PROJECT_BINARY_DIR=C:/Codebase/Learnings/camkelearn3

就是当前的目录。 实际上一般成熟的工程不会把source文件与cmake生成的文件放在一起,而是会放到不同的目录中。比如下面的目录结构:

project
|____sources
|   |   CMakeLists.txt
|   |   source1.cxx
____build

在build目录中运行cmake ../sources/,可以看到两个变量的值分别为:

-- PROJECT_BINARY_DIR=C:/Codebase/Learnings/camkelearn3/build
-- PROJECT_SOURCE_DIR=C:/Codebase/Learnings/camkelearn3/sources

这样就好懂了。 至于具体的解释,下回再写。