由于工作需要,最近在学习linux(#167~18.04.1-Ubuntu)下编译过程以及使用到的工具及概念,下面来做一个梳理总结。因此,本文适合新手村,高手请退让。
参考资料如下:
第二章 Linux C编程基础--make - 百度文库 (baidu.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(编译规则文件)中的命令,完成多文件的编译过程