gcc编译流程分为4个步骤,分别为:

  1. 预处理(Pre-Processing)
  2. 编译(compiling)
  3. 汇编(Assembling)
  4. 链接(Linking)

(1)预处理阶段

在该阶段,编译器将上述代码中的stdio.h编译进来,并且用户可以使用gcc的选项“-E”进行查看,该选项的作用是把源代码进行预处理。
预处理器根据以字符#开头的命令(directives),修改原始的C程序。如helloworld.c中的#include <stdio.h>指令告诉预处理器读系统头文件stdio.h的内容,并把它直接插入到程序文本中去。结果得到一个C程序,通常是以.i作为文件扩展名的。

(2)编译阶段
接下来进行的是编译阶段,在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码实际要做的工作,在检查无误后,gcc把代码编译成汇编代码。用户可以使用“-S”选项来进行查看,该选项生成汇编代码。汇编语言是非常有用的,它为不同高级语言不同编译器提供了通用语言。如:C编译器和Fortran编译器产生的输出文件都是一样的汇编语言。

(3)汇编阶段
汇编阶段是把编译阶段生成的“.s”文件转化成目标文件,读者可以使用选项“-c”把汇编代码转化为“.o”的二进制目标代码

(4)链接阶段

在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数库。

我们以hello.c 作为描述:

#include <stdio.h>
int main() {printf("hello world!\n");return 0;
}

在这段程序中并没有定义“printf”的函数实现,且在预编译中包含进去的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么是在哪里实现的“printf”函数的呢?

答案是:系统把这些函数实现都做到了名为libc.so.6的库文件中去了,在没有特别指定时,gcc会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。

函数库一般分为静态库和动态库两种。静态库是指在编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不需要库文件了,其后缀一般为“.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时链接文件加载库,这样就可以节省系统的开销,动态库一般后缀名为“.so”,如前面所述的libc.so.6就是动态库。gcc在编译时默认使用动态库。

完成了链接之后,gcc就可以生成可执行文件了。

GCC编译的四个阶段相关推荐

  1. gcc编译的四个过程

    gcc是什么? GNU编译器套件(GNU Compiler Collection)包括C.C++.Objective-C.Fortran.Java.Ada和Go语言的前端,也包括了这些语言的库(如li ...

  2. c语言编译四个步骤,gcc编译的四个步骤

    以最简单的hello.c为例子 一步到位:gcc hello.c 这条命令隐含执行了 (1)预处理 (2)编译 (3)汇编 (4)链接 这里未指定输出文件,默认输出为a.out gcc编译C源码有四个 ...

  3. c语言编译的四个阶段

    总结:(源文件名为loops.c) 可以转换到不同阶段.阶段1,将头文件加进来.阶段2,转换成汇编程序,与机器类型相关.阶段3,转换成机器码,但不完整.阶段4,链接其他系统文件,形成最终可执行文件 c ...

  4. linux下gcc编译的四个步骤,linux:gcc编译程序的四个阶段

    gcc的编译流程分为四个步骤,分别为: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking) gcc指令的一般格式为:gcc [选项 ...

  5. Yuchuan_Linux_C编程之二 GCC编译

    一.整体大纲  二.gcc编译的四个阶段 转载于:https://www.cnblogs.com/YuchuanHuaying/p/11128360.html

  6. gcc编译可执行文件和cmake编译可执行文件

    gcc编译 gcc的下载(下载mingw,里面包含gcc) 下载安装MinGW-w64详细步骤(c/c++的编译器gcc的windows版,win10真实可用) gcc编译可执行文件 由源码转换为可执 ...

  7. Gcc编译链接及常用选项总结

    转载文章:http://www.franktly.com 前言 GNU CC(简称Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object- C等语言编写的程序.Gcc ...

  8. linux下gcc编译c文件生成可执行文件的四个步骤

    Linux下gcc编译c文件为可执行文件分为四个步骤: 分别是 预编译.编译.汇编.链接. 1.预编译( 生成 hello.i 文件) 预编译的处理规则: 1. 将所有的 "#define& ...

  9. linux系统的编译原理,GCC编译原理_Linux编程_Linux公社-Linux系统门户网站

    一.编译过程 使用gcc编译程序时,编译过程可被细分为四个阶段: (1)预处理 (2)编译 (3)汇编 (4)链接 例如hello.c程序 hello.c: #include int main(voi ...

最新文章

  1. nginx php-fpm 运行原理
  2. 网站用域名能访问,用域名IP不能访问的原因分析
  3. 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统(瘋耔修改篇二)...
  4. Cortex-A、Cortex-R、Cortex-M处理器的性能比较
  5. 架构探险笔记5-使框架具备AOP特性(下)
  6. logback常用配置
  7. Wireshark网络抓包(一)——数据包、着色规则和提示
  8. sql查询出的字段切割_SPL 简化 SQL 案例详解:多层固定分组
  9. storm 出现一次运行结果,后续不在出现的原因
  10. Simplification of Articulated Meshes (EURO 09)
  11. ORACLE备份策略(ORACLE BACKUP STRATEGY)
  12. 最大后验估计与共轭分布
  13. 美景听听Ai语音导游,助力华为荣耀PLAY手机发布
  14. 2021-06-27函数定义与参数
  15. 130多个免费接口全部开放,涵盖天气数据、环境数据、旅游景点数据、位置数据、雷达、云图等等,可在线直接提供服务,免费的服务接口
  16. docker装LibreELEC_Linux和macOS系统安装LibreELEC的方法
  17. 【游戏技术】建造防守 Build and Defense
  18. 黑鲨重装计算机安装无法继续,黑鲨装机大师一键重装系统失败
  19. 一分钟教程:绘制中国地图
  20. macbookpro 2021 各种软件设置中找不到麦克风权限问题

热门文章

  1. 如何利用BetterZip Mac版筛选过滤压缩文件?
  2. Protobuf基本用法
  3. 淘宝/天猫seller_order_list-获取卖出的商品订单列表接口接入解决方案
  4. 安卓微信指纹java,麻将一下
  5. PHP语言基础知识总结(二)
  6. mac 桌面分屏软件_让你更加详细了解Mac分屏功能
  7. Halcon 缺陷检测 金属拉丝表面缺陷检测(乘法增强、傅里叶变换与卷积、纹理过滤、动态阈值)
  8. Linux服务器利用Nginx搭建网站
  9. elementUI 表格表头合并行列后show-overflow-tooltip不生效问题
  10. JLink Info: CPU could not be halted 错误解决