C/C++程序编译流程

程序的基本流程如图:

1. 预处理

预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。

  • 读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理

①将所有的“#define”删除,并且展开所有的宏定义

②处理所有的条件编译指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“endif”等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉。

③处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。

(注意:这个过程可能是递归进行的,也就是说被包含的文件可能还包含其他文件)

  • 删除所有的注释
  • 添加行号和文件名标识。

    以便于编译时编译器产生调试用的行号信息及用于编译时产生的编译错误或警告时能够显示行号

  • 保留所有的#pragma编译器指令

2. 编译

将预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。

3. 汇编

将编译完的汇编代码文件翻译成机器指令,并生成可重定位目标程序的.o文件,该文件为二进制文件,字节编码是机器指令。

汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。所以汇编器的汇编过程相对于编译器来讲比较简单,它没有复杂的语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译即可。

4. 链接

通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序。

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

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

链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。

至此,大致经过这几个步骤,一个完整的可执行程序产生了。

时间: 2024-10-26 00:19:08

C/C++程序编译流程的相关文章

程序编译流程

可以讲编程语言划分为两大类: 编译型语言 运行前,先由编译器将高级语言的代码编译成对应机器的cpu汇编指令,然后再有汇编器汇编为目标机器码,生成可执行文件,然后运行最终生成的可执行文件 解释型语言 运行时,由翻译器将高级语言代码反应成中间代码,并由解释器将该中间代码解释成机器码并执行,相当于编译和执行二合一 编译一个C程序分为四个阶段: 1.预处理阶段 2.生成汇编代码阶段 3.汇编阶段 4.链接阶段 ps:也就是说,gcc会生成汇编的.o文件,然后通过链接,生成.out文件 编译的主要步骤有:

C/C++编译流程

编译的基本流程 graph TD A(预处理) --> B(编译) B --> C(汇编) C --> D(链接) 详细过程 #include <stdio.h> int main(int argc, char *argv[]) { printf("Hello World!\n"); return 0; } 预处理(cpp) gcc -E hello.c -o hello.i 预处理,主要处理以下指令:宏定义指令,条件编译指令,头文件包含指令. 预处理所完

linux软件编译流程

首先先总结下linux下一些概念1,gcc可以说是史上最强大的c语言编译器起作用是将软件程序的源代码(纯文本文件)和利用已存在的函数库通过其本身gcc编译成计算机可识别的二进制文件.该过程为程序编译的普遍流程 2,环境检测程序(通常名为configuration或config),由于每个linux distribution使用的的内核版本是不同的,而不同的linux内核版本使用的系统调用和软件所需要的相关函数库可能也是不同的,因此对于软件在不同的操作系统以及内核版本上安装就需要通过某种环境监测机

&lt;01&gt;主函数分析+创建一个新的Target+C语言程序执行流程

1.C语言的源程序的后缀:.c格式 2.C语言源程序: 1)由函数构成 2)在一个程序中,只有一个主函数(主函数由系统调用) 3)函数只有被调用的时候,才执行 4)如果没有主函数程序无法运行 5) C语言中语句结束一定要有分号 3.主函数的写法: int main(){ printf("hello world"); return 0; } 4.C语言程序的执行 1)command+r 2)点击左上角的 三角 符号 //Program ended with exit code: 0  程

c++ --程序编译

程序编译 程序的编译流程大体可分为编辑.预处理.编译和链接4个步骤. 1. 编辑 编辑程序:将源文件输入计算机进行修改和保存的过程就称为“编辑”. 2. 预处理 预处理器是在真正的编译开始之前由编译器调用的独立程序.预处理器可以删除注释.包含文件以及执行宏替代. 预处理器在编译器之前根据指令更改程序文本.编译器看到的是预处理器修改过的代码文本. "#include "."#define "等都属于编译预处理.预处理行尾不加分号.原则上预处理行可以写在程序的任意位置,

《暗黑世界》安卓APK 编译流程详细说明教程!(图文)

原地址:http://bbs.gameres.com/forum.php?mod=viewthread&tid=223671 关于开发环境的搭建,之前的相关文档已经很详细的说明,对环境的搭建请参考以前的相关文档,如有问题,及时在论坛里提问,会有管理人员快速解答,此文档主要针对eclipse下安卓编译.    首先肯定是把暗黑世界的源码导入eclipse,源码导入进来后,就开始进行编译的准备工作,这里首先需要将Classes里面的.cpp文件和和相关的文件夹路径写进来,打开eclipse下的暗黑世

Java程序编译和运行的过程【转】

转自:http://www.360doc.com/content/14/0218/23/9440338_353675002.shtml Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程. 如下图,Java程序从源文件创建到程序运行要经过两大步骤:1.源文件由编译器编译成字节码(ByteCode)  2.字节码由java虚拟机解释运行.因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解释语言( "semi-interpreted&quo

反编译流程

在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用的APK进行反编译查看.下面是我参考了一些文章后简单的教程详解. (注:反编译不是让各位开发者去对一个应用破解搞重装什么的,主要目的是为了促进开发者学习,借鉴好的代码,提升自我开发水平.) 测试环境: win 7 使用工具: CSDN上下载地址: apktool (资源文件获取) 下载 dex2ja

[国嵌笔记][012][GCC程序编译]

GCC特点 GCC(GUN C Compiler)是GUN推出的功能强大.性能优越的多平台编译器.其执行效率与一般编译器相比平均效率要高20%~30%. GCC基本用法 gcc [options] filenames GCC编译流程 hello.c->预编译->hello.i->编译->hello.s->汇编->hello.o->链接->hello gcc -E hello.c -o hello.i   "-E"表示执行预处理 "