文档章节

Linux下C语言程序的编译过程

o
 onedotdot
发布于 2017/08/26 13:31
字数 847
阅读 5
收藏 0
点赞 0
评论 0

 

Linux下C语言程序的编译过程

使用gcc编译程序时,编译工程分为4个阶段:

(1)预处理:(Pre-Processing)

(2)编译:(Compiling)

(3)汇编:(Assembling)

(4)链接:(linking)

linux程序员可以根据自己的需要让gcc在编译的任何阶段结束,以便检查或使用编译器在该阶段输出信息,或者对最后生成的二进制文件进行控制,以便加入不同数量和种类的调试代码来为今后的调试做好准备。和其他常用的编译器一样,gcc提供了灵活而强大的代码优化功能,利用它可以生成执行效率较高的代码。

在功能上,预处理、编译、汇编是3个不同的阶段,但gcc在实际操作时可以把3个步骤合并为一个步骤来执行。下面以一个实例介绍如何生成各个阶段的代码。

   本小节的演示都针对文件 hello.c 进行

   1. /*
   2.  * hello.c
   3.  */
   4.
   5.   #include <stdio.h>
   6.   int  main()
   7.   {
   8.     printf(" Bettergoal, Better life! /n");
   9.     return 0;
  10.   }

第一阶段

在预处理阶段,输入的是C语言源文件,通常为*.c或者*.C,它们一般带有*h之类的头文件。这个阶段主要处理源文件中的#ifdef、#include和#define预处理命令。该阶段会生成一个中间文件*.i

1.生成预处理后的文件hello.i

    $ gcc -E hello.c -o hello.i

它通过对源文件hello.c使用E选项来生成中间文件hello.i

 

第二阶段

在编译阶段,输入的是中间文件*.i,编译后生成汇编语言文件*.s。这个阶段对应的gcc命令如下所示:

2 .生成汇编语言文件hello.s

      $ gcc-s hello.i -o hello.s

 

第三阶段

在汇编阶段,将输入的汇编文件*.s转换成二进制机器代码*.o,这个阶段对应的gcc命令如下所示:

    $ gcc -c hello.s-o hello.o

 

第四阶段

在链接阶段,将输入的二进制机器代码文件*.o(与其他机器代码文件和库文件)汇集成一个可执行的二进制代码文件。

4. 生成可执行文件

      $ gcc hello.o -o hello 

总结版:

对应以上四个阶段,直接一个命令

gcc hello.c -o hello

 

最后阶段

5. 运行及结果

      $ ./hello

      Better goal, Better life!

 

一以下是C程序一般的编译过程:


 

 

 从图中看到:

     将编写的一个c程序(源代码 )转换成可以在硬件上运行的程序(可执行代码 ),需要进行编译阶段  和链接这两个阶段。

     其中,

     1.  编译阶段先通过“编译器 “把一个 .c/ .cpp 源代码 编译成 .s的汇编代码 ;再经过“汇编器 ”把这个.s的汇编代码汇编成 .o 的目标代码

     2.  “连接器 “ 通过连接其他 .o 代码(如果需要的话)库文件和1中的.o 目标代码生成可执行文件

该文件流被这三种程序(红色)的加工,分别表现出四种形式(蓝色),这就是c程序的编译和链接过程。如果再详细的话,编译器在将源文件编译成汇编文件的过程又分为:预处理阶段(生成 .i代码)和  优化阶段

 

本文转载自:http://blog.csdn.net/u013457167/article/details/51160575

共有 人打赏支持
o
粉丝 6
博文 321
码字总数 14350
作品 0
朝阳
c语言基础学习02_helloworld

============================================================================= 涉及到的知识点有:include有两种用法、{}大括号用法解释、C语言自定义名字的要求、 c语言库函数printf的解...

黑泽明军
2017/12/12
0
0
你为什么看不懂Linux内核驱动源码?

学习嵌入式Linux驱动开发,最核心的技能就是能够编写Linux内核驱动、深入理解Linux内核。而做到这一步的基础,就是你要看得懂Linux内核源码,了解其基本的框架和具体实现,了解其内核API的使...

宅学部落
04/28
0
0
[C++] C++程序执行过程

要理解一个程序的执行过程,首先要理解什么是编译器。我们用C语言写的程序,计算机只能识别机器语言(二进制指令),计算机并不能理解。因此,必须 将C语言转换为机器语言。编译器就是用来实...

枫兮兮
2014/03/12
0
0
linux环境下编译安装ICE

前面我们讲过了在linux环境下通过rpm的方式来安装ICE,这种安装方式可以是比较简单的,自己在安装过程中发现后面PHP无法装在IcePHP.sp模块,也有可能自己在安装过程中某个地方出错了。又尝试...

mmmw
2013/09/13
0
0
Linux 程序设计--读书笔记

1 Linux 程序设计 1.1 Linux shell 登录进 Linux 与 shell 进行交互时, 它像 Windows 中的命令提示窗口一样运行程序. 它在一组指定的目录路径下按照你给出的程序名搜索与之同名的文件. 搜索的...

yuberhu
05/06
0
0
嵌入式开发之C基础学习笔记02--第一个例子分析

1.C语言程序结构和书写规范 系统头文件 #include <stdio.h> 双引号:自定义库文件 尖括号:操作系统下规定的库文件 /this is a helloword program/ <---注释 #include <stdio.h> <---编译预处......

吴锦涛
2012/12/09
0
2
SDL以及扩展库的交叉编译过程简介

** Writen by Rao 2012年04月20日 星期五 21时57分16秒 ** 下面我介绍一下SDL以及SDL的扩展库在arm11上的交叉编译 在这里我将SDL 交叉编译的相关都安装在/opt/arm目录下 相关简介: SDL官方网...

mjrao
2012/04/21
0
0
GCC编译的背后( 预处理和编译 汇编和链接 )

by falconzhangjinw@gmail.com 2008-02-22 平时在Linux下写代码,直接用"gcc -o out in.c"就把代码编译好了,但是这后面到底做了什么事情呢?如果学习过编译原理则不难理解,一般高级语言程序...

AlphaJay
2010/05/18
0
1
Linux编译工具:gcc入门

1. 什么是gcc gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C++、java、Pascal等语言。...

zjy900507
05/09
0
0
嵌入式工程师有前途吗 嵌入式开发的职业发展方向是什么

嵌入式早在70年代出现到现在,有将近30年的发展历史,能够长久存在并且可持续发展。从工程师起步, 一般有几个发展方向,一个是成为技术方面的核心,领域内的专家;另一个是从项目中锻炼起来...

创客学院
04/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CDH的坑之Sqoop导出数据到MySQL

CDH的坑之Sqoop导出数据到MySQL 最近使用Sqoop从Hive导出数据到MySQL中,出现了一系列的问题,下面将这个问题记录一下,避免再度踩坑! 导出语句 sqoop export --connect jdbc:mysql://192....

星汉
9分钟前
0
0
Hyperledger Fabric 客户端开发三

前面两篇文章介绍了Hyperledger Fabric SDK并使用一个实例介绍如何通过SDK和Hyperledger Fabric Blockchain交互, 现在详细分析相关的过程。 首先看 enroll (登录) admin 过程。 'use stric...

十一月不远
10分钟前
0
0
PowerDesigner连接MySQL和逆向工程图

最近想梳理公司项目的表间关系,从项目后台管理系统的操作入手,以及代码的hibernate注解入手,都不算特别尽人意,于是最后还是鼓捣了一下PowerDesigner的逆向工程图,这样更直观一些。 想着...

Oo若离oO
10分钟前
0
0
威胁web应用安全的错误

一般绝大部分的web应用攻击都是没特定目标的大范围漏洞扫描,只有少数攻击确实是为入侵特定目标而进行的针对性尝试。这两种攻击都非常频繁,难以准确检测出来,许多网站的web应用防火墙都无法...

上树的熊
13分钟前
2
0
pypy2 install crypto error

install pycryptodome instead pip install pycryptodome

coord
17分钟前
0
0
Service Mesh所应对的8项挑战

Lori Macvittie 微服务架构是把双刃剑,我们享受它带来的开发速度(development velocity),却也不得不面对服务间通讯带来的复杂性问题。 目前大多数扩展容器化微服务的架构多是基于proxy-b...

好雨云帮
26分钟前
0
0
时间复杂度

1. 维基上的定义 在计算机科学中,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低...

liuyan_lc
32分钟前
0
0
js中的~符

~是js里的按位取反操作符,~~就是执行两次按位取反,其实就是保持原值,但是注意虽然是原值,但是对布尔型变量执行这个操作,会转化成相应的数值型变量,也就是 ~~true === 1,~~false === 0...

JamesView
33分钟前
0
0
webpack安装

npm install --save-dev webpack-cli

Vincent-Duan
35分钟前
0
0
实时监听EditText内容变化

主要是addTextChangedListener方法的使用 aswerEdittext.addTextChangedListener(new TextWatcher() { //编辑框的内容发生改变之前的回调方法 @Override public void before...

王先森oO
38分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部