C++ 编译过程
2015-08-11 21:59
302 查看
编译器直接将源代码转化成汇编语言或机器指令。
C++编译过程主要有以下几个过程:
(1)编译预处理
预处理主要包括三种:1)宏定义命令;2)条件编译命令;3)头文件包含命令。预处理命令以“#”开头。编译程序完成的工作,可以说是对源程序的“替换”工作。经过这个过程,生成一个没有宏定义、没有条件编译、没有特殊符号的输出文件(中间文件)。
(2)编译、优化阶段
编译程序的工作是,通过词法分析、语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码或汇编代码。
在生成中间代码或汇编代码过程中,可能涉及到优化处理。优化有两种:一种优化仅涉及代码本身,主要是删除公共表达式、循环优化、代码外提、无用代码赋值的删除等。另一种优化设计具体的计算机硬件。
中间代码或者汇编代码生成以后,编译程序将中间代码转换为目标机器指令的序列,得到对应于源程序的目标文件。目标文件中存放的也就是与源程序等效的目标机器的机器语言代码。目标文件一般至少包含2个段:代码段和数据段。
(3)链接过程
将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。
补充链接类型:
静态链接
在这种连接方式下,函数的代码将直接拷贝到最终的可执行文件中。该程序被执行时候,会被装入该进程的虚拟地址空间中。静态链接库实际上是一个或若干目标文件。
动态链接
这种方式下,函数的代码被放到称作动态连接库或共享对象的某个目标文件中。链接程序此时的工作只是在生成的可执行文件中,记录下共享对象的名字以及少量关键信息。动态连接库可以被多个进程共享,在运行时候内存中只有一个实例。
二者比较
使用动态链接能够使可执行文件较小,并且当共享对象被多个进程使用时节省内存。但有时候系统运行改变或省级,不能保证动态连接库一定可用、有效。
可参考文章:
http://www.360doc.com/content/14/0109/16/835125_343879650.shtml
C++编译过程主要有以下几个过程:
(1)编译预处理
预处理主要包括三种:1)宏定义命令;2)条件编译命令;3)头文件包含命令。预处理命令以“#”开头。编译程序完成的工作,可以说是对源程序的“替换”工作。经过这个过程,生成一个没有宏定义、没有条件编译、没有特殊符号的输出文件(中间文件)。
(2)编译、优化阶段
编译程序的工作是,通过词法分析、语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码或汇编代码。
在生成中间代码或汇编代码过程中,可能涉及到优化处理。优化有两种:一种优化仅涉及代码本身,主要是删除公共表达式、循环优化、代码外提、无用代码赋值的删除等。另一种优化设计具体的计算机硬件。
中间代码或者汇编代码生成以后,编译程序将中间代码转换为目标机器指令的序列,得到对应于源程序的目标文件。目标文件中存放的也就是与源程序等效的目标机器的机器语言代码。目标文件一般至少包含2个段:代码段和数据段。
(3)链接过程
将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。
补充链接类型:
静态链接
在这种连接方式下,函数的代码将直接拷贝到最终的可执行文件中。该程序被执行时候,会被装入该进程的虚拟地址空间中。静态链接库实际上是一个或若干目标文件。
动态链接
这种方式下,函数的代码被放到称作动态连接库或共享对象的某个目标文件中。链接程序此时的工作只是在生成的可执行文件中,记录下共享对象的名字以及少量关键信息。动态连接库可以被多个进程共享,在运行时候内存中只有一个实例。
二者比较
使用动态链接能够使可执行文件较小,并且当共享对象被多个进程使用时节省内存。但有时候系统运行改变或省级,不能保证动态连接库一定可用、有效。
可参考文章:
http://www.360doc.com/content/14/0109/16/835125_343879650.shtml
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++ Custom Control控件向父窗体发送对应的消息
- C++中拷贝构造函数的应用详解