1.以最小的cmake配置为例
eg:
cmake_minimum_required(VERSION 3.0)
project(sample CXX)
add_library(sample sample.cpp)
add_executable(sample_exe sample_exe.cpp)
2.cmake_minimum_required
- 该函数规定了此工程使用的cmake最低版本。
- 由于cmake仍在不断发展,每个版本均会修改一些函数参数,也会添加更多函数。此函数的作用是为了防止使用版本过低的cmake来配置导致非预期错误。
3.project
该函数声明了此项目的名称。
由于一个项目中可能包含多个库或多个可执行程序,在子库/子可执行程序中禁止使用与该函数声明中的相同的名称。
该函数第二个参数为该项目的代码类型。
- 可声明 C 或 CXX 或 C CXX。
- 对应的代表了纯c工程,纯c++工程与混合工程。
注意:声明的代码类型影响了编译器的选取。
如上面所讲,每个cmake项目均应当声明此关键字,这影响了整个项目的属性。cmake也会提供项目对应的各个变量
- PROJECT_NAME 项目名称
- PROJECT_SOURCE_DIR 项目源码根目录
- PROJECT_VERSION 项目版本
- PROJECT_BINARY_DIR 项目生成的临时二进制目录,用于存放配置/编译中间文件。
4.add_library / add_executable
第一个参数代表了该库/可执行程序的名称。
第二个参数代表了要生成的二进制使用的源文件。
- 这里可以使用列表变量。
- 也可以直接添加源文件名称。
- 也可以在后续使用函数 target_source 添加源文件。
- 注意:声明win32可执行程序时,应在add_executable中程序名称后添加关键字 WIN32 。
add_library 还可以添加其他关键字例如:
- SHARED 声明该库仅被作为动态库生成
- STATIC 声明该库仅被作为静态库生成
- OBJECT 声明该target仅生成中间binary文件,以供其他target使用
- INTERFACE 声明该库仅是一个接口而并没有属于自己的binary
- ALIAS 声明该库仅是其他库的别名
- IMPORTED 声明该库不需要构建,而是已被导入具体配置。此方式一般存在于依赖提供的配置中。
- 在未声明前五个关键字时,库的构建类型根据 BUILD_SHARED_LIBS 变化。
5.关键字 target
target在cmake中是一个很重要的概念,你应当将它理解为一个object。
它包含了例如以下内容:
- 相关的源文件列表
- 相关的编译选项
- 相关的依赖库
- 相关的头文件路径列表
- 相关的库文件路径列表
- 相关的其他属性
所以,你在后续可以使用这个target名称做任何事情。对应的cmake函数会使用该名称自动提取函数需使用的属性值。
6.关键字 PUBLC PRIVATE INTERFACE
这些关键字是用于搭建依赖关系。
-
PUBLIC 声明该关键字后续的值在构建该target时使用,并向下游提供。
-
PRIVATE 声明该关键字后续的值仅在构建该target时使用,不向下游提供。
-
INTERFACE 声明该关键字仅向下游提供,不在构建该target时使用。
-
参考:CMake教程系列-01-最小配置示例