基本

概念

  • 每个项目使用一个CMakeLists.txt。(每个目录一个)
  • 跨平台,并可以生成原生编译配置文件。在Linux/Unix平台,生成Makefile;在苹果平台可以生成Xcode;在windows平台,可以生成MSVC的工程文件。
  • 使用的是cmake语法,指令是大小写无关的,参数和变量是大小写相关的。

构建

内部构建

一.在CMakeLists.txt的目录下执行以下命令:

cmake .

二.执行正确会生成以下中间文件:
1.文件:

CMakeCache.txt、cmake_install.cmake、Makefile

2.文件夹:

CMakeFiles

三.在CMakeLists.txt的目录下执行以下命令即可生成对应的可执行文件:

make

外部构建

内部构建会在工程目录下生成很多文件/文件夹(中间文件),我们可以利用外部构建把这些生成的中间文件存在单独一个文件夹内。
一般是在工程目录下(CMakeLists.txt的目录下)创建一个build文件夹,然后进入build文件夹,执行以下命令,即可将中间文件生成到build中:

cmake ..

这样构建的话,PROJECT_SOURCE_DIR仍然指代工程路径,即CMakeLists.txt的目录的绝对路径,而PROJECT_BINARY_DIR指代编译路径,即build的绝对路径。

例子

1

一.创建工程目录1,并创建CMakeLists.txt文件和main.c文件。
CMakeLists.txt:

PROJECT(HELLO)
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR" ${HELLO_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR" ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})

main.c:

#include <stdio.h>
int main(){
    printf("hello\n");
    return 0;
}

二.执行cmake .命令生成Makefile文件,再执行make命令即可生成hello可执行文件。

语法

可以使用双引号“”将源文件包含起来。处理特别难处理的名字比如fun c.c,则使用SET(SRC_LIST “fun c.c”)可以防止报错。

ROJECT(projectname [CXX] [C] [Java])

基本

这个指令定义工程名称,并且可以指定工程支持的语言,支持的语言列表可以不指定的,默认情况表示支持所有语言。

[xxx]代表是可以省略不填的,后续指令同样如此。填的话取的值就是去掉[]即可,比如指定工程支持C,就去掉[C]的[]即可:C。

projectname指的是具体的工程名称,比如:hello。

扩展

此指令隐式的定义了两个cmake的变量:

<projectname>_BINARY_DIR
<projectname>_SOURCE_DIR

其中<xxx>指定的对应的值,即PROJECT(projectname [CXX] [C] [Java])中的projectname的值。

这个两个变量也同时可以用以下来表示,避免写错工程名称:

PROJECT_BINARY_DIR
PROJECT_SOURCE_DIR

SET

基本

这个指令定义变量,可以设置普通变量、缓存条目、环境变量三种变量的值。

普通变量

set(<variable> <value>… [PARENT_SCOPE])

<variable>指的要定义的变量名称,<value>指的是具体的值。

<value>…指的是可以给变量设置0个或者多个值,当设置多个值时(大于2个),多个值会通过分号连接符(;)连接成一个真实的值赋值给变量,当设置0个值时,实际上是把变量变为未设置状态,相当于调用unset命令。

变量variable的作用域为调用set命令的函数或者当前目录,如果使用了PARENT_SCOPE选项,意味着该变量的作用域会传递到上一层(也就是上一层目录或者当前函数的调用者,如果是函数则传递到函数的调用者,如果是目录则传递到上一层目录),并且在当前作用域该变量不受带PARENT_SCOPE选项的set命令的影响(如果变量之前没有定义,那么在当前作用域仍然是无定义的;如果之前有定义值,那么值和之前定义的值保持一致)。每一个新的目录或者函数都会创建一个新的作用域,普通变量的作用域,如果不使用PARENT_SCOPE选项,只能从外层往内层传递。

缓存条目

set(<variable> <value>… CACHE <type> <docstring> [FORCE])
见:
https://www.jianshu.com/p/c2c71d5a09e9

环境变量

set(ENV{<variable>} [<value>])
见:
https://www.jianshu.com/p/c2c71d5a09e9

扩展

定义单个值的变量
cmake_minimum_required (VERSION 3.10.2)
project (set_test)
set (normal_var a)
message (">>> value = ${normal_var}")

#输出
>>> value = a
定义多个值的变量
cmake_minimum_required (VERSION 3.10.2)
project (set_test)
set (normal_var a b c)
message (">>> value = ${normal_var}")

#输出
>>> value = a;b;c
定义空值的变量
cmake_minimum_required (VERSION 3.10.2)
project (set_test)
set (normal_var a b c)
message (">>> value = ${normal_var}")
set (normal_var) # 设置变量为空
message (">>> value = ${normal_var}")

#输出
>>> value = a;b;c
>>> value =

MESSAGE

基本

向终端输出用户定义的信息

扩展

ADD_EXECUTABLE

基本

定义了一个可执行文件

扩展