初识CMake
初识CMake
CMake 是一个 跨平台的 项目构建工具,CMake不过就是比makefile更高级一些,makefile不仅写起来繁琐,并且不同平台有所差异。
我们知道一个C/C++程序从源代码变为可执行程序需要经过 预处理(.i)->编译(.s)->汇编(.o)->链接(可执行)
四个阶段。如果我们一个项目当中的源文件较少,我们可以通过命令行来直接对源文件进行编译,但是如果是一个大项目当中进行编译,命令会变得特别的长且繁琐,并且不容易维护,易出错。
我们有两个办法来解决:
1、编写makefile,对makefile文件进行编写指令,让makefile告诉编译器该如何执行命令。然后我们需要使用 make
批处理命令,将makefile文件中所有的指令全部执行完毕。
2、我们使用CMake来构建项目,我们需要再CMakeLists.txt文件中编写CMake脚本,使用 cmake CMakeLists.txt文件路径
来对CMake进行构建makefile文件。
CMake安装及使用
安装一个CMake工具,我们需要准备Linux环境,并且使用VSCode远程连接Linux,一般Linux都是自带CMake工具的,如果没有就安装一下CMake
。使用 cmake --version
查看当前CMake版本。
以下是代码示例:
add.cpp:
代码语言:javascript代码运行次数:0运行复制#include <cstdio>
#include "head.h"
const char* libVersion = "Library Version 1.0";
int add(int a, int b)
{
auto number = 8;
return a + b;
}
div.cpp:
代码语言:javascript代码运行次数:0运行复制#include <cstdio>
#include "head.h"
double divide(int a, int b)
{
return (double)a / b;
}
multi.cpp:
代码语言:javascript代码运行次数:0运行复制#include <cstdio>
#include "head.h"
int multiply(int a, int b)
{
return a * b;
}
sub.cpp:
代码语言:javascript代码运行次数:0运行复制#include <cstdio>
#include "head.h"
int subtract(int a, int b)
{
return a - b;
}
head.h:
代码语言:javascript代码运行次数:0运行复制#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
main.cpp:
代码语言:javascript代码运行次数:0运行复制#include <iostream>
#include <cstdio>
#include "head.h"
using std::endl;
using std::cout;
using std::cin;
int main()
{
int a = 20;
int b = 12;
cout << "a = " << a << ", b = " << b << endl;
cout << "a + b = " << add(a, b) << endl;
cout << "a - b = " << subtract(a, b) << endl;
cout << "a * b = " << multiply(a, b) << endl;
cout << "a / b = " << divide(a, b) << endl;
return 0;
}
我们可以直接通过命令行来编译源文件:
我们使用CMake来构建项目,我们就需要先在当前面目录下新建一个 CMakeLists.txt
文件,这个文件每一个字母都不能错。
注释
注释行:CMake使用#作为行注释,可以放在任意位置:
代码语言:javascript代码运行次数:0运行复制# 这是一个CMake文件
cmake_minimum_required(VERSION 3.15)
project(test)
块注释:使用 #[[]]
形式进行块注释:
#[[这是一个块注释
wadubafa wad
fawawwidaf
awdfwawaf ]]
常用命令
- cmake_minimum_required命令:我们使用
cmake_mininum_required
来指定使用的cmake的最低版本。这是一个可选命令,非必须,如果不加可能会有警告。但是我们最好指定一下我们使用CMake的版本,因为CMake3.0与CMake3.15在语法层面就有些许差别,我们尽量指定CMake3.15以上版本的使用。
cmake_minimum_required(VERSION 3.15)
- project命令:定义工程名,并指定工程版本、工程描述、web主业地址,支持的语言(默认情况支持所有语言),如果不需要这些都是可以忽略的,只需要指定出工程名字即可。一些其他的可选项,这里就不再展示了,如果感兴趣可以去官网查阅。
project(<PROJECT-NAME> [<language-name> ...]) # 指定项目的项目名称
- add_executeable命令:定义工程会生成一个可执行程序,指定可执行程序名称与源文件,如果是多个源文件,可以在以 空格 或者
;
作为分隔符,
add_executeable(可执行程序名称 源文件名称)
- 执行cmake命令:我们将CMakeLists.txt文件编辑好之后,就可以执行
cmake
命令了。
cmake CMakeLists.txt文件所在路径
xzy@iZ0jle4p97d8x4byf3u32mZ:~/cmake/version0$ tree . ├── add.cpp ├── build ├── CMakeLists.txt ├── div.cpp ├── head.h ├── main.cpp ├── multi.cpp ├── mybin └── sub.cpp
这是文件目录结构,如果我们在当前目录编译CMakeLists.txt文件,我们直接使用 cmake .
如果我们想要在build目录下编译,我们可以使用 cmake ..
来编译。
编写CMakeLists.txt并构建makefile
代码语言:javascript代码运行次数:0运行复制cmake_minimum_required(VERSION 3.15)
project(test)
add_executable(mybin add.cpp div.cpp multi.cpp sub.cpp main.cpp)
这些都是由CMake编译得来的,我们发现也自动生成了makefile文件,那么我们执行make命令就可以得到可执行程序了:
我们可以看到,除了我们想要的makefile文件之外,还生成了一些其他的文件,而这些文件在当前目录就会显得非常杂乱,所以我们可以新建一个文件夹,在文件夹中执行cmake命令,让生成的文件全部都在新建目录下:
这样目录结构就会变得更加清晰:
这个时候去到build目录中运行可执行程序: