make、makefile、cmake及相关内容

最近在学gn和ninja,设计到了makefile相关的内容,相关概念有些记不太清楚了,重新查阅了一下,顺便留个笔记方便以后查看。

开始的时候先简单介绍一下程序的生命周期,源码到可执行程序,一般需要经过四个过程:
在这里插入图片描述
上图截取自《深入理解计算机系统》,图中说明了,一个程序要从源文件变为一个可执行的机器文件,需要至少四个步骤(python之类的语言还有一个解释过程)。

举个简单的例子,我们要在屏幕上面打印一句“hello world!”,除去编辑的过程,源文件先要经过预处理得到*.i文件,然后经过编译得到*.s文件,在经过汇编得到.o文件,最后链接成为可执行文件。

预处理是预处理器将*.c文件的宏展开,然后直接将宏替换,去除注释,得到纯asicii文件;

编译是指将*.i文件转换为汇编语句的过程;

汇编是将汇编文件转换为机器语言,也就是0101的计算机可识别的文件;

链接是将汇编后的目标文件链接为可执行的二进制文件。

值得注意的是预处理器被集成到编译器上面了,但是调用gcc的时候仍然会生成*.i文件,命令为

gcc -E hello.c -o hello.i

有了上面的基本了解,简单介绍一下makefile是个什么东东,makefile是一个编译和链接规则的集合,主要的作用是告诉make,怎么去调用gcc或g++编译源文件,然后怎么去链接目标文件。

makefile(文本) > make(工具) > gcc/g++(编译)

当前的大部分IDE,在用户单击编译按钮后,都会生成一个makefile,然后在后台去调用编译器和链接器生成可执行程序。

gcc、g++、make、makefile、cmake介绍:

gcc和g++的区别:

先说一下相关概念:GCC : GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。

gcc是GCC中的GUN C Compiler(C 编译器)

g++是GCC中的GUN C++ Compiler(C++编译器)

主要区别:

  1. 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的);

  2. 对于 .c和.cpp文件,g++则统一当做cpp文件编译;

  3. 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL;

  4. gcc在编译C文件时,可使用的预定义宏是比较少的;

  5. gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏,这些宏如下:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
  1. 在用gcc编译c++文件时,为了能够使用STL,需要加参数 –lstdc++ ,但这并不代表 gcc –lstdc++ 和 g++等价,它们的区别不仅仅是这个;

  2. 在C语言中,我们使用gcc命令来编译和链接C程序。例如编译单个源文件:

    gcc main.c

    编译多个源文件:

    gcc main.c module.c

    编译C++程序时,gcc命令也可以使用,不过要增加-lstdc++选项,否则会发生链接错误。例如编译单个源文件:

    gcc main.cpp -lstdc++

    编译多个源文件:

    gcc main.cpp module.cpp -lstdc++

    gcc命令在链接时默认使用C的库,只有添加了-lstdc++选项才会使用 C++ 的库。

    不过 GCC 中还有一个g++命令,它专门用来编译 C++ 程序,广大 C++
    开发人员也都使用这个命令。g++命令和gcc命令的用法如出一辙,例如编译单个源文件:

    g++ main.cpp

    编译多个源文件:

    g++ main.cpp module.cpp

    使用-o选项可以指定可执行文件的名称:

    g++ main.cpp -o demo ./demo

gcc/g++与make区别:
当你的程序只有一个源文件时,直接就可以用gcc命令编译它。但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大.

所以出现了make工具!make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。

makefile是什么?简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。

make与cmake区别:
makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。

这时候就出现了Cmake这个工具,cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。

可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。

以上

内容参考了下面的博文,十分感谢:
GNU makefile入门
gcc、g++、gdb、make、cmake、makefile总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值