编译过程、gcc、make、Makefile学习总结

由于工作需要,最近在学习linux(#167~18.04.1-Ubuntu)下编译过程以及使用到的工具及概念,下面来做一个梳理总结。因此,本文适合新手村,高手请退让。

参考资料如下:

第二章 Linux C编程基础--make - 百度文库 (baidu.com)

Makefile教程 - 知乎 (zhihu.com)

深入讲解GCC和Make的区别_gcc make_cleverln的博客-CSDN博客

Makefile编译选项:CFLAGS、LDFLAGS、LIBS_趣多多代言人的博客-CSDN博客

CFLAGS/CXXFLAGS/LDFLAGS和gcc的关系 - 简书 (jianshu.com)

交叉编译工具 aarch64-linux-gnu-gcc 安装和ATF编译_ds@向日葵的博客-CSDN博客

gcc 编译命令详解及最佳实践 - 知乎 (zhihu.com)

将makefile中的宏传递给源码 - 墨尔基阿德斯 - 博客园 (cnblogs.com)

1、gcc

从两个角度理解gcc的概念:

A:gcc是“GNU Compiler Collection”的缩写,从字面意思可以知道它是一个编译工具集合,包括了编译过程中所需的所有工具。

B:gcc是一个软件,与linux下其他软件地位等同,如vim软件。

既然是软件,就有使用方法,gcc常用选项如下,在下面介绍完编译过程后,给出使用举例。

-E :仅执行预处理(不要编译、汇编或链接)。

-S :只编译(不汇编或链接)。

-c :编译和汇编,但不链接。 常用于多文件

-o <file> :指定输出文件

-I :指定头文件的包含路径。

-L :指定链接库的包含路径。

-shared :创建共享库/动态库

关于gcc,刚开始记住以上两点就可以了,一下了解的太多,有可能分不清主次,到最后什么都记不住。

-------------------------------------------------------------------------------------------------------------------------------

下面是扩展阅读,视情况阅读:

GCC, the GNU Compiler Collection。The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, Go, and D, as well as libraries for these languages (libstdc++,...).

GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。 GCC是自由软件过程发展中的著名例子,由自由软件基金会以GPL协议发布。

GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。后来又扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)

 2、编译过程

学习过程中有一个很重要的心得体会:

linux下编写、编译、调试C语言,可以更好的理解其内部的原理及流程

整个编译过程分为 编译预处理 编译 链接三步,其中编译又分为两步,一步是将C语言编译成汇编,再一步是将汇编转换成目标文件,整个代码开发流程如下图所示:

C编译器是以C文件为单位进行编译的。这决定了某些错误在编译过程中不会呈现。

如上所述,gcc是个工具链(集合),在编译程序的过程中调用不同的工具

3、gcc使用示例

了解了编译过程及gcc后,就可以进行代码编写及编译、运行了,下面以经典的hello world程序为例说明:

建议使用vscode作为开发IDE,vscode集成了ssh及gdb debug插件,可以远程服务器代码,然后本地开发及调试。

可以一步到位,编译成可执行文件:

也可以按照上述编译过程逐步编译:

多文件编译:

4、make

Make是增量式批处理(编译)工具也是一个软件,也是用来编译代码的。

那有gcc了,为什么还要用make工具呢?

A 工作量问题:对于拥有多个(上百个)源文件的软件项目,如果像上面那样,每次源文件修改后都要重复输入众多的文件名和编译命令进行编译。而使用make工具,只需将编译过程/命令保存到文件中,make工具读入此文件,进行自动编译。

B 囗效率问题:make能够根据文件的时间戳自动发现更新过的源文件,并通过读入编译过程/命令文件来对更新的源文件进行编译而对其它文件只进行链接操作。

5、Makefile

上节所说的“编译过程/命令文件”即Makefile文件。

Makefile是Make读入的唯一配置文件,其中包含的规则指明make编译哪些文件以及怎么编译这些文件,格式如下:

目标(Target):先决条件(prerequisites)/依赖项

<TAB键> 命令

在Makefile中的命令,一定要以[Tab]键开始

Makefile中第一个很重要个概念就是目标

写Makefile的时候,一般只会编写编译和链接这两个步骤。在执行编译步骤的时候,我们的系统会默认把我们的预处理和编译都执行一次

还是以第三节多文件编译为例,使用make+Makefile进行编译的过程如下:

6、gcc make Makefile关系

各种概念关系如下

一句话概括:

make(增量式批处理工具) 调度GCC(编译器)执行Makefile(编译规则文件)中的命令,完成多文件的编译过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值