Chinaunix首页 | 论坛 | 博客
  • 博客访问: 552877
  • 博文数量: 181
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1498
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-22 15:17
个人简介

用发呆的时间来理清自己的思绪

文章存档

2015年(7)

2014年(134)

2013年(40)

分类: C/C++

2014-05-20 10:10:29

C语言的编译过程分为四个过程:以test.c的编译过程为例:
    1.预处理
        此阶段要完成主要的3个工作:
        (1) 完成头文件内容的替换工作。
        (2)实现宏替换。
        (3)条件编译。
        从以上三个过程可以看出,此阶段的所有处理过程在C语言中都是以#开头的,此阶段不进行语法检查,只进行简单的替换工作。此阶段完成之后产生的.i文件会变大(原因:增加了替换后的内容)。
        在gcc中实现这个步骤使用以下命令:
        gcc -E test.c -o test.i
    2.编译
      编译程主要是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。即首先进行语法检查,然后进行翻译工作。
        在gcc中实现这个步骤使用以下命令:
        gcc -S test.i -o test.s

    3.汇编
     汇编实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。目标文件由段组成。通常一个目标文件中至少有两个段:

      代码段:顾名思义就是存放程序代码的段,主要存放一系列的指令。

      数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。
      在gcc中实现这个步骤使用以下命令:
      gcc -c test.s -o test.o

    4.连接
     由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。

      例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。

      链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。
      在gcc中实现这个步骤使用以下命令:
      gcc  test.o -o test 
总结:
-E                       Preprocess only; do not compile, assemble or link
-S                       Compile only; do not assemble or link
-c                       Compile and assemble, but do not link
-o                       Place the output into

阅读(1551) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~