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/

3. make教程

makefile书写:https://seisman.github.io/how-to-write-makefile/

posted @ 2022-05-01 11:52  silence_cho  阅读(980)  评论(0编辑  收藏  举报