常用变量
变量说明
- PROJECT_SOURCE_DIR
PROJECT_SOURCE_DIR代表当前项目根目录的路径。当使用project命令指定项目名称时,CMake会自动设置PROJECT_SOURCE_DIR的默认值为项目根目录的路径(CMakeLists.txt所在的路径)。如果使用的是子目录CMakeLists.txt,那么PROJECT_SOURCE_DIR将会是子目录的路径。
(注:如果没有使用project命令指定项目名称,该变量为空) - PROJECT_BINARY_DIR
PROJECT_SOURCE_DIR代表当前项目构建目录的路径。默认路径是 ${CMAKE_BINARY_DIR},即 CMake 运行时生成的默认构建目录。默认情况下,它与源代码目录平行,即为${PROJECT_SOURCE_DIR}/build。不过,也可以使用 -B 参数在运行 CMake 时指定其他构建目录。
(注:如果没有使用project命令指定项目名称,该变量为空) - CMAKE_SOURCE_DIR
最外层CMakeLists.txt所在目录。 - CMAKE_BINARY_DIR
与最外层CMakeLists.txt所在目录平级。即为${CMAKE_SOURCE_DIR}/build。 - CMAKE_CURRENT_SOURCE_DIR
当前运行CMakeLists.txt所在目录。 - CMAKE_CURRENT_BINARY_DIR
与当前CMakeLists.txt所在目录平级。即为${CMAKE_SOURCE_DIR}/build。 - CMAKE_CURRENT_LIST_FILE
当前正在处理的CMakeLists.txt的完整路径和文件名。即为${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt。 - CMAKE_CURRENT_LIST_LINE
当前正在处理的 CMakeLists.txt 的行号。 - CMAKE_MODULE_PATH
用于指定额外的CMake模块路径的变量。在使用CMake构建项目时,它会搜索这些路径以查找额外的模块文件。
默认情况下,CMake会搜索一些标准模块路径来查找常见的模块文件。但是,有时你可能需要添加自定义的模块路径,例如为了包含自己编写的特定模块文件或引入第三方库提供的CMake模块。你可以使用set命令将自定义的模块路径添加到CMAKE_MODULE_PATH变量中,这样,在执行find_package等相关操作时,CMake就会先搜索这个自定义的模块路径,然后再搜索其他标准模块路径来查找所需的模块文件。 - EXECUTABLE_OUTPUT_PATH
目标二进制可执行文件的存放位置,如果产生的是可执行文件并且没有指定 CMAKE_RUNTIME_OUTPUT_DIRECTORY 则存放在该目录下。 - LIBRARY_OUTPUT_PATH
默认存放库文件的位置,如果产生的是静态库并且没有指定 CMAKE_ARCHIVE_OUTPUT_DIRECTORY 则存放在该目录下。如果产生的是动态库并且没有指定 CMAKE_LIBRARY_OUTPUT_DIRECTORY 则存放在该目录下。 - CMAKE_CXX_STANDARD
C++ 语言有不同版本的标准,如 C++ 98、C++ 11、C++ 14 等。不同标准提供的特性有所区别,故有必要在 CMakeLists.txt 中为项目指定使用何种标准,进而让 CMake 使用正确的编译器标志(比如 -std=c++11)。对于 CMake v3.1 以上版本,可以通过 CMAKE_CXX_STANDARD 变量指定标准,或通过 target_compile_features 函数根据使用的特性自动推断适用于目标的编译器标志。
例如:
# 将 C++ 标准设置为 C++ 11
set(CMAKE_CXX_STANDARD 11)
- CMAKE_CXX_STANDARD_REQUIRED
CXX_STANDARD_REQUIRED 是一个布尔类型的变量,用于描述是否需要(强制)指定 CXX_STANDARD。当打开此选项,且当前使用的编译器不支持指定的标准时,会在 configuring 阶段报错失败,不会进行编译。
例如:
# C++ 11 是强制要求,不会衰退至低版本
set(CMAKE_CXX_STANDARD_REQUIRED ON)
- CMAKE_CXX_EXTENSIONS
经常与 CMAKE_CXX_STANDARD 一同设置,该属性用于指定是否使用编译器特有的扩展(即,不同的编译器在 C++ 标准之外自行实现的、非通用的特性)。对于某些编译器来说,启用此选项后会在编译行中添加特殊的标志,比如用 -std=gnu++11 替换 -std=c++11。该属性默认为 ON。如果某个项目对可移植性有较高的要求,可能为不同的平台使用不同的编译器,那么建议将其设置为 OFF。
例如:
# 禁止使用编译器特有扩展
set(CMAKE_CXX_EXTENSIONS OFF)
样例
源码目录以及构建目录
./demo/
|--build
|--CMakeLists.txt
|--lib
| |--CMakeLists.txt
| |--libfunc.cpp
|--main.cpp
./demo/CMakeLists.txt的内容如下:
cmake_minimum_required (VERSION 3.22)
project (demo)
message("demo_1.PROJECT_BINARY_DIR = ${PROJECT_BINARY_DIR}")
message("demo_2.PROJECT_SOURCE _DIR = ${PROJECT_SOURCE_DIR}")
message("demo_3.CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
message("demo_4.CMAKE_BINARY_DIR = ${CMAKE_BINARY_DIR}")
message("demo_3.CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")
message("demo_4.CMAKE_CURRENT_BINARY_DIR = ${CMAKE_CURRENT_BINARY_DIR}")
message("demo_5.CMAKE_CURRENT_LIST_FILE = ${CMAKE_CURRENT_LIST_FILE}")
message("demo_6.CMAKE_CURRENT_LIST_LINE = ${CMAKE_CURRENT_LIST_LINE}")
message("demo_7.CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
add_subdirectory(lib)
add_executable(${PROJECT_NAME} main.cpp)
./demo/lib/CMakeLists.txt的内容如下:
cmake_minimum_required (VERSION 3.22)
project (lib_1)
message("demo_sub_1.PROJECT_BINARY_DIR = ${PROJECT_BINARY_DIR}")
message("demo_sub_2.PROJECT_SOURCE _DIR = ${PROJECT_SOURCE_DIR}")
message("demo_sub_3.CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
message("demo_sub_4.CMAKE_BINARY_DIR = ${CMAKE_BINARY_DIR}")
message("demo_sub_3.CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")
message("demo_sub_4.CMAKE_CURRENT_BINARY_DIR = ${CMAKE_CURRENT_BINARY_DIR}")
message("demo_sub_5.CMAKE_CURRENT_LIST_FILE = ${CMAKE_CURRENT_LIST_FILE}")
message("demo_sub_6.CMAKE_CURRENT_LIST_LINE = ${CMAKE_CURRENT_LIST_LINE}")
message("demo_sub_7.CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
add_library(${PROJECT_NAME} libfunc.cpp)
执行cmake
在***/demo/build路径下执行:
cmake ..
终端显示如下信息:
***:~/cmake_test/demo/build$ cmake ..
demo_1.PROJECT_BINARY_DIR = ***/cmake_test/demo/build
demo_2.PROJECT_SOURCE _DIR = ***/cmake_test/demo
demo_3.CMAKE_SOURCE_DIR = ***/cmake_test/demo
demo_4.CMAKE_BINARY_DIR = ***/cmake_test/demo/build
demo_3.CMAKE_CURRENT_SOURCE_DIR = ***/cmake_test/demo
demo_4.CMAKE_CURRENT_BINARY_DIR = ***/cmake_test/demo/build
demo_5.CMAKE_CURRENT_LIST_FILE = ***/cmake_test/demo/CMakeLists.txt
demo_6.CMAKE_CURRENT_LIST_LINE = 12
demo_7.CMAKE_SOURCE_DIR = ***/cmake_test/demo
demo_sub_1.PROJECT_BINARY_DIR = ***/cmake_test/demo/build/lib
demo_sub_2.PROJECT_SOURCE _DIR = ***/cmake_test/demo/lib
demo_sub_3.CMAKE_SOURCE_DIR = ***/cmake_test/demo
demo_sub_4.CMAKE_BINARY_DIR = ***/cmake_test/demo/build
demo_sub_3.CMAKE_CURRENT_SOURCE_DIR = ***/cmake_test/demo/lib
demo_sub_4.CMAKE_CURRENT_BINARY_DIR = ***/cmake_test/demo/build/lib
demo_sub_5.CMAKE_CURRENT_LIST_FILE = ***/cmake_test/demo/lib/CMakeLists.txt
demo_sub_6.CMAKE_CURRENT_LIST_LINE = 12
demo_sub_7.CMAKE_SOURCE_DIR = ***/cmake_test/demo
-- Configuring done
-- Generating done
-- Build files have been written to: ***/cmake_test/demo/build