cmake和makefile
1. 基本概念
编译器和GCC
编译器是翻译代码为计算机语言的一个工具,我们平时写的代码如果想在某个特定的计算机上执行(计算机的cpu构架不同),就需要编译器来对代码进行编译汇编链接,而汇编和链接的过程对于每个不同的平台上过程都不一样。GCC是GNU Compiler Collection,也称为GNU编译器套件,可以理解为编译器,它可以编译很多种语言:C/C++、FORTRAN、JAVA、OBJC、ADA等。
GCC官网:http://gcc.gnu.org/
关于GCC整体架构:https://zhuanlan.zhihu.com/p/372526494
GCC工具中,我们常用的命令有gcc和g++,假如我有一个源文件(比如.c文件),我就可以用gcc命令来编译它,比如.cpp文件就可以用g++来编译。
linux系统中安装gcc和g++
sudo apt install gcc # 安装gcc
gcc -V # 查看gcc的版本
sudo apt install g++ # 安装g++
g++ -v # 查看g++版本
查看gcc的版本:
make和makefile
我们刚开始学习代码,经常会采用g++进行编译,如下面命令编译一个单独的test.cpp文件:
g++ -g test.cpp -o test
但是如果源文件很多,就需要一个一个编译,比较麻烦,而make工具则方便我们对多个源文件进行编译。
make工具相当于一个智能的批处理工具,本身没有编译和链接的功能,而是用类似于批处理的方式通过调用makefile文件中用户指定的命令来进行编译和链接。而makefile又是什么,就相当于用户将要执行的一系列命令,make根据makefile中的命令对相应的源文件进行编译和链接的
makefile中可能就有类似的一下命令:gcc -o test.c。
makefile文件在github源码安装程序中很常见,你下载了一个源码包,通常在readme中会有这样的一句:
make all
make install # root required
make all即编译所有,当然这个源码包中必须有makefile文件才行,执行make all这个命令后make会根据makefile中的命令进行编译。
cmake和CMakeLists
根据上面,我们需要自己写makefile,但是makefile写起来还是比较麻烦,所以我们需要cmake工具。cmake可以跨平台生成对应平台能用的makefile,无需自己根据每个平台的不同特性去修改。而cmake根据什么生成makefile,它需要根据CMakeLists.txt文件(组态档)去生成makefile。
所以一般自己写项目的CMakeLists.txt文件,别人就可以进行编译了。(使用IDE时,IDE会自动生成CMakeLists.txt)
比如我们在github上clone一个项目,常执行下面编译命令:
mkdir build && cd build
cmake .. # 根据项目中的CMakeLists.txt文件,在当前路径生成makefile
make -j # 根据当前路径中的makefile编译
总结下整个流程如下图:
参考:https://oldpan.me/archives/gcc-make-cmake-clang-tell
https://zhuanlan.zhihu.com/p/111110992?from_voters_page=true
2. CMake教程
官方教程:https://cmake.org/cmake/help/latest/guide/tutorial/index.html
https://blog.csdn.net/weixin_43669941/article/details/112913301
https://zhuanlan.zhihu.com/p/119426899
https://zhuanlan.zhihu.com/p/361123818
https://github.com/seisman/how-to-write-makefile/