C++-CMake:最小配置示例

一个最小的cmake配置包含什么?

来让我们看看下面的代码:

cmake_minimum_required(VERSION 3.0)
project(sample CXX)
add_library(sample sample.cpp)
add_executable(sample_exe sample_exe.cpp)

cmake_minimum_required

该函数规定了此工程使用的cmake最低版本。

由于cmake仍在不断发展,每个版本均会修改一些函数参数,也会添加更多函数。此函数的作用是为了防止使用版本过低的cmake来配置导致非预期错误。

project

该函数声明了此项目的名称。

由于一个项目中可能包含多个库或多个可执行程序,在子库/子可执行程序中禁止使用与该函数声明中的相同的名称。

该函数第二个参数为该项目的代码类型。可声明 C 或 CXX 或 C CXX。对应的代表了纯c工程,纯c++工程与混合工程。

注意:声明的代码类型影响了编译器的选取。

add_library / add_executable

add_library(sample sample.cpp)
add_executable(sample_exe sample_exe.cpp)

该函数声明了添加一个库或添加一个可执行程序。

  • 第一个参数代表了该库/可执行程序的名称。在没有明确声明生成二进制文件名时,也代表了对应生成的二进制文件名。
  • 第二个参数代表了要生成的二进制使用的源文件。这里可以使用列表变量,也可以直接添加源文件名称。当然,也可以在后续使用函数 target_source 添加源文件。

当然,还可以添加其他关键字例如:

  • SHARED 声明该库仅被作为动态库生成
  • STATIC 声明该库仅被作为静态库生成
  • OBJECT 声明该target仅生成中间binary文件,以供其他target使用
  • INTERFACE 声明该库仅是一个接口而并没有属于自己的binary
  • ALIAS 声明该库仅是其他库的别名
  • IMPORTED 声明该库不需要构建,而是已被导入具体配置。此方式一般存在于依赖提供的配置中。

上述关键字只能在 add_library 中被声明。

在未声明前五个关键字时,库的构建类型根据 BUILD_SHARED_LIBS 变化。

注意:声明win32可执行程序时,应在add_executable中程序名称后添加关键字 WIN32 。

关键字 project

如上面所讲,每个cmake项目均应当声明此关键字,这影响了整个项目的属性。cmake也会提供项目对应的各个变量,例如:

  • PROJECT_NAME 项目名称
  • PROJECT_SOURCE_DIR 项目源码根目录
  • PROJECT_VERSION 项目版本
  • PROJECT_BINARY_DIR 项目生成的临时二进制目录,用于存放配置/编译中间文件。

关键字 target

target在cmake中是一个很重要的概念,你应当将它理解为一个object。它包含了例如以下内容:

  • 相关的源文件列表
  • 相关的编译选项
  • 相关的依赖库
  • 相关的头文件路径列表
  • 相关的库文件路径列表
  • 相关的其他属性

所以,你在后续可以使用这个target名称做任何事情。对应的cmake函数会使用该名称自动提取函数需使用的属性值。

关键字 PUBLC PRIVATE INTERFACE

这些关键字是用于搭建依赖关系。

  • PUBLIC 声明该关键字后续的值在构建该target时使用,并向下游提供。
  • PRIVATE 声明该关键字后续的值仅在构建该target时使用,不向下游提供。
  • INTERFACE 声明该关键字仅向下游提供,不在构建该target时使用。

CMake教程系列-01-最小配置示例 - 知乎

你可能感兴趣的:(#,C++/CMAKE,c++,CMAKE)