文档章节

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

o
 onedotdot
发布于 2017/08/26 13:31
字数 847
阅读 5
收藏 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
粉丝 7
博文 352
码字总数 14350
作品 0
朝阳
c语言基础学习02_helloworld

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

黑泽明军
2017/12/12
0
0
嵌入式开发之C基础学习笔记02--第一个例子分析

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

吴锦涛
2012/12/09
0
2
[C++] C++程序执行过程

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

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

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

mmmw
2013/09/13
0
0
你为什么看不懂Linux内核驱动源码?

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

宅学部落
04/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
24分钟前
0
0
现场看路演了!

HiBlock
昨天
4
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
4
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
4
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部