可以大致概括为3个阶段:
  1. 源文件 → 汇编代码(文本)
  2. 汇编代码 → 机器语言(二进制)
  3. 各个目标文件的处理
详细过程:
  1. 预编译处理 Pre-processing(*.c/ *.cpp → *.i)

    • 对源文件中的伪指令进行处理,伪指令包括如下几种:
    • 宏定义(#define)
    • 条件编译指令(#ifdef, #ifndef, #else, #elif, #endif等)
    • 头文件包含指令(#include)
    • 特殊符号的处理(如LINE等)
    • 这一步骤的实质就是把源文件中的伪指令替换掉,生成一个没有宏定义、条件编译指令、头文件包含指令和特殊符号的文件,这个文件是源文件的等效文本文件。
  2. 编译阶段 Compilation(*.i → *.s)及优化阶段(这里不作展开)
    • 对经过预处理阶段输出的文件,进行语法分析和词法分析
    • 通过语法分析和词法分析后,编译为汇编代码(文本)
  3. 汇编阶段 Assembly(*.s → *.o)
    • 将汇编代码文件编译成机器码(目标文件,二进制)
  4. 链接阶段 Linking(*.out)
    • 静态链接

      • 将所需的函数从静态链接库copy到输出的可执行文件中,即最终输出的可执行文件成了上一阶段的目标文件的集合,文件体积较大
    • 动态链接
      • 只在最终输出的可执行文件中记录下相关静态链接库的信息,只在被执行时才加载该部分代码,体积较小,但加载其他库时可能会消耗一点性能

C:源文件编译过程的更多相关文章

  1. C语言编译过程及数据类型

    写在前面 C语言可以称得上是高级语言中的低级语言,接下来一段时间,我会写一下文章关于c语言,把它的神秘面纱一 一揭开.下面主要是c语言的C语言编译过程及数据类型 源文件编译过程 为了使计算机能执行高级 ...

  2. 在Unix系统上,从源文件、目标文件、可执行文件的编译过程

    是由“编译器驱动”(compiler driver)完成的: unix> gcc -o hello hello.c 在这里,gcc的编译器驱动程序读取源文件hello.c, #include & ...

  3. Android工程的编译过程

    现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的每一步都做了什么,需要 ...

  4. Linux系统GCC常用命令和GCC编译过程描述

    前言: GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言.GCC 很快地扩展,变得可处理 C++.后来又 扩展能够支持更多编程语言,如Fortran. ...

  5. gcc编译过程简述

    在linux系统上,从源文件到目标文件的转化是由编译器完成的.以hello.c程序的编译为例,如下: dfcao@linux: gcc -o hello hello.c 在这里,gcc编译器读取源文件 ...

  6. android 编译过程

    引用:http://www.cnblogs.com/devinzhang/archive/2011/12/20/2294686.html http://blog.sina.com.cn/s/blog_ ...

  7. 关于一个程序的编译过程 zkjg面试

    http://blog.csdn.net/gengyichao/article/details/6544266 一 以下是C程序一般的编译过程: 从图中看到: 将编写的一个c程序(源代码 )转换成可以 ...

  8. C语言编译过程

    GCC编译C源码有四个步骤: 预处理-----> 编译 ----> 汇编 ----> 链接 一. 编译和链接的流程 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在 ...

  9. C语言编译过程详解

    前言 C语言程序从源代码到二进制行程序都经历了那些过程?本文以Linux下C语言的编译过程为例,讲解C语言程序的编译过程. 编写hello world C程序: // hello.c #include ...

随机推荐

  1. maven下载与配置环境变量

    1.打开maven官网下载 http://maven.apache.org/download.cgi 下载 解压(这里博主放在D盘下) 2.配置环境变量 验证是否配置成功 3.本地仓库配置

  2. Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException

    这个版本默认是开启了保护模式,进入redis的文件夹下的src 输入(前提是得开启redis服务): ./redis-cli config set protected-mode "no&qu ...

  3. python 编程测试练习答案

    -- coding: UTF-8 -- file('B.txt','wb').write(file('A.txt','rb').read()) 作业内容 这次作业较为简单,从一个a.txt的多行文本文 ...

  4. (asp.net)百度浏览器Cookie的神奇bug

    HttpCookie cookie = new HttpCookie("version"); cookie.Value = "1.1"; cookie.Expi ...

  5. php redis 秒杀demo

    $redis = new Redis(); $redis->connect("127.0.0.1", "6379"); $redis->select ...

  6. 织梦dedecms获取当前内容页栏目id号的方法

    一,可在内容模板中直接这样写{dede:field.typeid/} 可显示本栏目的id 二,也可这样写 {dede:type}[field:ID /]{/dede:type}  . 三, 如果是在{ ...

  7. puma(5300✨) Rails的一个多线程,高并发处理的web server

    https://github.com/puma/puma 在开发和产品环境下,Puma是一个简单,快速,多线程,并高并发highly concurrent HTTP1.1server for Ruby ...

  8. http协议与soap协议区别

  9. Spring的引用内部Bean属性和给级联属性

    第一个是内部Bean的配置:               首先是要理解其中的原理,再去操作就很简单了,下面老表就给大家说一下自己的观点(有点简单,但是老表我第一次学习的时候看着视频上的代码确实有点懵逼 ...

  10. oracle实例内存(SGA和PGA)调整-xin

    一.名词解释 (1)SGA:System Global Area是Oracle Instance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池.数据缓冲区.日志缓冲区. ( ...