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

预处理(Pre-Processing)

编译(Compiling)

汇编(Assembling)

链接(Linking)

gcc指令的一般格式为:gcc [选项] 要编译的文件 [选项]

[目标文件]

其中,目标文件可缺省,gcc默认生成可执行的文件名为:编译文件.out

如:#gcc -o hello hello.c

该命令将hello.c直接生成最终二进制可执行程序a.out

这条命令隐含执行了(1)预处理、(2)汇编、(3)编译并(4)链接形成最终的二进制可执行程序。这里未指定输出文件,默认输出为a.out。

如何要指定最终二进制可执行程序名,那么用-o选项来指定名称。比如需要生成执行程序hello.exe

那么

#gcc hello.c -o hello.exe

下面就具体来查看一下gcc是如何完成四个步骤的:

(1)预处理阶段

预处理是C语言程序从源代码变成可执行程序的第一步,主要是C语言编译器对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等。

在该阶段,用户可以使用gcc的选项”-E”进行查看,该选项的作用是让gcc在预处理结束后停止编译过程。

预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。如hello.c中#include

指令告诉预处理器读系统头文件stdio.h的内容,并把它直接插入到程序文本中去。结果就得到另外一个C程序,以.i作为文件扩展名。

命令:gcc –E hello.c –o

hello.i

(2)编译阶段

在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译

成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。汇编语言是非常有用的,它为不同高级语言不同编译器提供

了通用的语言。

命令:gcc –S hello.i –o hello.s

(3)汇编阶段

汇编阶段是把编译阶段生成的”.s”文件转成目标文件,读者在此可使用选项”-c”就可看到汇编代码已转化为”.o”的二进制目标代码了。

命令:gcc –c hello.s –o hello.o

(4)链接阶段

在成功编译之后,就进入了链接阶段。将编译输出文件hello.o链接成最终可执行文件hello.exe

命令:gcc hello.o –o hello.exe

运行该可执行文件,出现正确的结果如下。

命令:./hello

Hello World!

一般的,我们不需要一步一步输命令查看整个的编译过程,我们通常一步生成或两步生成。

命令:

一步:gcc -o hello hello.c

两步:gcc -c hello hello.c

gcc -o hello hello.o

输出结果: ./hello

linux下gcc编译的四个步骤,linux:gcc编译程序的四个阶段相关推荐

  1. Linux下的编译(环境是centos6.8 gcc 4.4.7)

    Linux下的编译(环境是centos6.8 gcc 4.4.7) 1. 运行命令:yum install gcc gcc-c++ bzip2 bzip2-devel bzip2-libs Pytho ...

  2. 从四个问题透析Linux下C++编译链接

    摘要:编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理.本文通过开发过程中碰到的四个典型 ...

  3. Linux下Nginx编译安装过程详解

    Linux下Nginx编译安装过程详解 一.Nginx介绍 二.Nginx源码下载 1.打开Nginx官网 2.下载官网的源码包 三.Nginx源码安装 1.解压源码包 2.安装开发包组及环境 3.编 ...

  4. linux postgresql 创建数据库,Linux下创建Postgresql数据库的方法步骤

    Linux下创建Postgresql数据库的方法步骤 前言 PostgreSQL (也叫 Postgres)是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行. ...

  5. Linux下静态编译的一个TIP

    Linux下静态编译的一个TIP | 素包子 Linux下静态编译的一个TIP 2010年3月28日 baoz 阅读评论 linux下静态编译好处很多,一来是可以跨发行版(debian redhat ...

  6. linux apache 安装 rewrite,linux下单独编译安装Apache rewrite_module

    Redhat linux下单独编译安装Apache rewrite_module Apache已经编译安装完了,今天弄了个lifebox,装完后发现必须得用rewrite,所以就给它装了个~~ 找到a ...

  7. Linux下Nginx编译安装后的开机自启动设置

    Linux下Nginx编译安装后的开机自启动设置 一.查看当前Nginx启动状态 二.而配置Nginx相关服务文件 三 .设置nginx命令 四.设置开机启动 五.测试开机启动 一.查看当前Nginx ...

  8. linux下mysql-5.5.15安装详细步骤

    linux下mysql-5.5.15安装详细步骤 注:该文档中用到的目录路径以及一些实际的值都是作为例子来用,具体的目录路径以各自安装时的环境为准 mysql运行时需要一个启动目录.一个安装目录和一个 ...

  9. Linux下多线程编译

    linux下多线程编译注意事项: 编译时加入 -lm -lpthread参数 参数说明:-lm  使用math.h中声明的库函数还有一点特殊之处,gcc命令行必须加-lm选项,因为数学函数位于libm ...

  10. Linux下nginx编译安装,重新添加模块

    Linux下nginx编译安装,重新添加模块 前言:编译完成后的Nginx,当我们需要新的功能模块时,要怎么重新添加呢?可以按照下面的方法试试. 1.查看nginx版本以及编译安装模块 [root@# ...

最新文章

  1. Arcface v1 论文翻译与解读
  2. mysql数据库主从配置
  3. 经典笔试题:用C写一个函数测试当前机器大小端模式
  4. C语言写300k文件大概多少行,为什么 DELPHI 编译出的程序一般的来说至少都有300k呢?...
  5. 同步工具之Semaphore信号量
  6. C#图解教程 第二十四章 反射和特性
  7. H3CTE讲师分享H3C认证培训实验9 IP基础
  8. github fork自己的库,如何同步源库的更新
  9. html5 逐帧播放 代码,html5-video – 使用媒体源扩展进行逐帧解码
  10. 星河互联刘玮玮:Echo卖疯了,为什么擅长制造爆款的中国人又没跟上?
  11. applet java_Java applet 类
  12. python自学之《21天学通Python》(2)
  13. 【rose】rose框架学习总结
  14. mysql实体指的是_数据库中,实体是指( )。
  15. 4.1Reduction模型
  16. java polygon 用法_Java Polygon.getBounds方法代码示例
  17. Java公历(阳历)转换农历(阴历)工具类
  18. 冯诺依曼计算机的运行原理
  19. 3.Java获得内网网段所有可通信的ip地址
  20. 瑞萨IDE:CS+ for CC下载、安装和基础使用

热门文章

  1. python股票量化交易(8)---K线图:锤头,射击之星,早晨之星
  2. linux查看wifi网速,无线信号强度解析及linux如何查看wifi信号强弱等
  3. 简述python的书写规则_python3 基本书写规范
  4. 小丸子学Oracle 12c系列之——Oracle Pluggable Database
  5. uni-app - APP平台禁止页面滑动(无法上下滚动屏幕页面)
  6. 简单了解一些分布式术语,分享给大家
  7. 计算机操作系统原理--Linux实例分析
  8. 【Axure教程】中继器表格自动合计模板
  9. 《GPU高性能编程》——gl_helper.h
  10. 什么是FPGA工程师的核心竞争力