CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。
而 CMake 恰好能解决上述问题, 其允许开发者指定整个工程的编译流程,在根据编译平台,自动生成本地化的Makefile和工程文件
,最后用户只需make
编译即可,所以可以把CMake看成一款自动生成 Makefile的工具。
CMake
使用 #
进行行注释
。
# 这是一个 CMakeLists.txt 文件
cmake_minimum_required(VERSION 3.1.0)
CMake
使用 #[[ ]]
进行块注释
。
#[[ 这是一个 CMakeLists.txt 文件。
这是一个 CMakeLists.txt 文件
这是一个 CMakeLists.txt 文件]]
cmake_minimum_required(VERSION 3.0.0)
cmake_minimum_required
:指定使用的 cmake 的最低版本。
用法:cmake_minimum_required(最低版本号)
举例:
cmake_minimum_required(VERSION 3.10)
#[[
"3.10" 是 CMake 的最低版本号。这一行代码告诉 CMake 最低所需的版本号,CMake 会检查你所使用的 CMake 版本是否 满足最低要求。如果你的 CMake 版本低于指定的版本,那么 CMake 将停止构建并给出错误信息
]]
project
:定义工程名称,并可指定工程的版本、工程描述,如果不需要是可以忽略的,只需要指定出工程名字即可。
用法:project(工程名称)
举例:
cmake_minimum_required(VERSION 3.10)
project(app)
project(app)
是 CMake 的一个指令,用于定义项目的名称。在这里,app
是项目的名称,你可以根据需要修改为你实际的项目名称。
通过使用 project
指令,你可以告诉 CMake 构建系统关于你的项目的一些基本信息,例如项目的名称、版本号、支持的语言等。这些信息对于 CMake 在生成构建文件时非常重要。
实际上,project
指令还可以带上其他可选参数,可以更详细地指定项目的属性,例如:
project(app
VERSION 1.0
DESCRIPTION "A sample CMake project"
LANGUAGES CXX)
这里,我们除了指定项目的名称为 app
外,还指定了项目的版本号、描述和所使用的编程语言(在此示例中是 C++)。这些信息可以作为元数据用于构建生成的项目文件和工程文件。
请注意,在一个 CMakeLists.txt 文件中只能出现一次 project
指令,用于定义项目的主要信息。如果你的项目包含多个子目录或子项目,可以在每个子目录的 CMakeLists.txt 文件中使用 project
指令来定义子项目的信息。
add_executable
:定义工程生成一个可执行程序
用法1:add_executable(可执行程序名 源文件1名称 源文件2名称 源文件3名称)
用法2: add_executable(可执行程序名 源文件1名称;源文件2名称;源文件3名称)
举例:
cmake_minimum_required(VERSION 3.10)
project(app)
add_executable(app add.c sub.c div.c mult.c main.c)
#注意这里的可执行程序名和project中的项目名没有任何关系
在这里我们使用具体文件做示例:
add.c
sub.c
mult.c
div.c
head.h
main.c
CMakeLists.txt
add.c
#include
#include "head.h"
const char* libVersion = "Library Version 1.0";
int add(int a,int b)
{
return a+b;
}
sub.c
#include
#include "head.h"
int subtract(int a,int b)
{
return a-b;
}
mult.c
#include
#include "head.h"
int multiply(int a,int b)
{
return a*b;
}
div.c
#include
#include "head.h"
double divide(int a,int b)
{
return (double)a/b;
}
head.h
#ifndef _HEAD_H
#define _HEAD_H
int add(int a,int b);
int subtract(int a,int b);
int multiply(int a,int b);
double divide(int a,int b);
#endif
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(app)
add_executable(app add.c sub.c div.c mult.c main.c)
目录结构如下:
cmake ./
make
执行过程如下:
此时目录下生成很多文件,可以看到一个Makefile
:
执行make
生成app
此时已成功编译出可执行文件app
通过上面的例子可以看出,如果在CMakeLists.txt
文件所在目录执行了cmake
命令之后就会生成一些目录和文件(包括 makefile 文件
),如果基于makefile文件
执行make
命令,程序在编译过程中还会生成一些中间文件和一个可执行文件,这样会导致整个项目目录看起来很混乱,不太容易管理和维护,此时我们就可以把生成的这些与项目源码无关的文件统一放到一个对应的目录里边,比如将这个目录命名为build
:
继续使用以上的源文件进行测试:
mkdir build
cd build
cmake ../
make
过程如下,可以看到所有的cmake过程文件都生成在build的文件夹中了,这样使顶层目录更加整洁: