1.背景介绍
以往在linux编译C++文件都采用make的方式,即用户自己编写makefile,makefile中定义了一些编译规则和依赖,然后用make指令进行编译,得到可执行文件。
但是由于makefile的编写规则过于复杂,于是开发出一种新的简便的编译和管理工程的方式,即cmake。cmake的使用方式比较简单,即在当前文件夹下新建CMakeList.txt文件,这个文件也是定义编译规则和依赖的,但是书写简单。写完CMakeList.txt后,在当前文件夹使用cmake .,可以看到生成了一系列文件,其中就有makefile,之后再make,即生成可执行文件。
原来,cmake即是在make的基础上,抛弃makefile,使用书写简单的CMakeList.txt,再用cmake .指令自动生成makefile,节省了编写makefile的时间。
总结:makefile+make=CMakeList.txt+cmake .+make
2.一个简单案例
mkdir cmake_test
cd cmake_test
touch hello_world.cpp
# 此处写入hello_world.cpp内容,在下面
touch CMakeList.txt
# 此处写入CMakeList.txt的内容,在下面
cmake .
# 可以看到生成了包括makefile在内的许多东西
# 编译
make
# 可以看到生成了可执行文件helloworld_test
# 运行
./helloworld_test
# 终端有输出
附件1 hello_world.cpp
//hello_world.cpp
#include <iostream>
using namespace std;
int main()
{
cout<<"Hello World!"<<endl;
return 0;
}
附件2 CMakeList.txt
//CMakeList.txt
project(helloworld) // 声明项目的名称
//add_executable(目标可执行文件名,需编译的cpp文件)
add_executable( helloworld_test hello_world.cpp ) //添加可执行权限
效果图1->cmake .后
效果图2->make后(多了可执行文件 helloworld_test)
效果图3->运行后
3.优化
由于cmake时会产生许多中间文件,乱七八糟不美观,因此希望把一些中间文件放到一个地方去,即build文件夹。然后在build文件里cmake点点,即对build上层的文件进行编译,这时所有的中间文件都会放在build文件夹里,然后再build里再make。
# 新建build文件夹
mkdir build
# 注意CMakeList.txt仍在根目录下,即build上层
# cmake .代表编译当前目录,cmake ..代表编译上层目录
cd build
cmake ..
# makefile在build下,因此仍在build下make
make
# 这次可执行文件生成在build下,运行可执行文件
./helloworld_test
图1 项目根目录下
图2 build文件夹下
4.包含库文件的cmake
有时我们的项目中需要依赖一些库,这时候怎么编写CMakeList.txt?
基本的之前都介绍过了,直接上操作。
(此时文件夹vscode_test中有build,main.cpp,CMakeList.txt)
# include里放库的头文件,src里放库的源文件
mkdir include src
touch include/hello.h src/hello.cpp
# 此处编写hello.h和hello.cpp,代码放在下面
# 此处编写CMakeList.txt,代码放在下面
cd build
cmake ..
make
# 可以看到可执行文件和库文件均在build下
./helloworld_test
//hello.h
#pragma once
void sayHello();
//hello.cpp
#include "hello.h"
#include <iostream>
using namespace std;
void sayHello(){
cout<<"Hello World!"<<endl;
}
//main.cpp
#include "hello.h"
using namespace std;
int main(){
sayHello();
return 0;
}
# CMakeList.txt
project(helloworld) // 声明项目的名称
# 说明include文件夹时存放引用头文件的地方
include_directories("include")
# add_library( 要生成的库文件名, 库的源代码)
# 生成库文件
add_library( libHello src/hello.cpp )
# add_executable(目标可执行文件名,需编译的cpp文件)
# 添加可执行权限
add_executable( helloworld_test main.cpp )
# 因为helloworld_test里面调用了libhello这个库,因此要将他们链接上
# target_link_libraries( 目标可执行文件名,依赖的库文件名 )
target_link_libraries( helloworld_test libHello )
# 注意,这其中我们只关心源文件,因为头文件的依赖关系是cmake帮我们处理的。
参考视频:b站教程 1:13:00之后开始讲解cmake
一个很好的教程:Cmake入门教程、配套源码Github地址