c++学习之--关于程序编译
2013-11-17 15:06
225 查看
程序的编译流程:
编辑
预处理和编译
链接
关于编辑就不多说了,编辑就是将源文件输入计算机保存并修改。
预处理和编译,在编译之前会进行编译预处理
编译预处理包括:文件包含,宏,条件编译。关于编译预处理就是进行文件包含,宏展开,确定条件编译。然后是编译,编译是以一个个独立的文件作为单元,一个经过编译预处理的文件就会编译出一个目标文件(一个经过编译预处理的cpp文件就会编译出一个obj文件,在unix下是.o)编译器是根据后缀名来确定是否编译此文件。编译是以一个个单独的文件为单元的,这一点很重要,即编译只是负责本单元的事情,对于外部的事情一概不理会,在这一步里我们可以调用一个函数只需要在调用前得到函数的声明,而不必给出这个函数的定义,至于这个函数到底是怎么实现的,需要在链接这一步去找到函数的入口地址。因此提供声明的时候可以利用include文件包含,也可以在调用之前声明。编译阶段之后的事情就是分析语法的正确性之类的工作。
关于链接一直不是很清楚,写一下自己关于链接的理解。在经过编译之后会有多个obj文件(一般都不是单文件程序),简单的说就是将多个obj文件(这里也包括lib文件)和一些其他的资源组合在一起生成一个可执行的exe文件。链接的时候会检查全局空间里面是不是有重复定义或者缺失定义。这也就解释了为什么我们一般不会再头文件(h文件)中出现定义,因为头文件可能被释放到多个源文件中(cpp文件),在cpp文件编译完成,链接的时候就会发现全局空间会有多个定义。编译的时候会给出所有函数的虚拟地址,链接的时候会将这些虚拟地址转化为实地址。
编辑
预处理和编译
链接
关于编辑就不多说了,编辑就是将源文件输入计算机保存并修改。
预处理和编译,在编译之前会进行编译预处理
编译预处理包括:文件包含,宏,条件编译。关于编译预处理就是进行文件包含,宏展开,确定条件编译。然后是编译,编译是以一个个独立的文件作为单元,一个经过编译预处理的文件就会编译出一个目标文件(一个经过编译预处理的cpp文件就会编译出一个obj文件,在unix下是.o)编译器是根据后缀名来确定是否编译此文件。编译是以一个个单独的文件为单元的,这一点很重要,即编译只是负责本单元的事情,对于外部的事情一概不理会,在这一步里我们可以调用一个函数只需要在调用前得到函数的声明,而不必给出这个函数的定义,至于这个函数到底是怎么实现的,需要在链接这一步去找到函数的入口地址。因此提供声明的时候可以利用include文件包含,也可以在调用之前声明。编译阶段之后的事情就是分析语法的正确性之类的工作。
关于链接一直不是很清楚,写一下自己关于链接的理解。在经过编译之后会有多个obj文件(一般都不是单文件程序),简单的说就是将多个obj文件(这里也包括lib文件)和一些其他的资源组合在一起生成一个可执行的exe文件。链接的时候会检查全局空间里面是不是有重复定义或者缺失定义。这也就解释了为什么我们一般不会再头文件(h文件)中出现定义,因为头文件可能被释放到多个源文件中(cpp文件),在cpp文件编译完成,链接的时候就会发现全局空间会有多个定义。编译的时候会给出所有函数的虚拟地址,链接的时候会将这些虚拟地址转化为实地址。
相关文章推荐
- c++学习之--关于程序编译的文章
- 关于Basic程序解释器及编译原理的简单化(2)---C++封装好的Basic解释器
- 关于C/C++运行库编译出来的程序的运行过程~
- c++学习之--关于编译预处理
- [转]一些关于linux下编译C++程序的东西
- [LUA学习笔记01]用VS2003(C++)编译Hello Lua程序
- 关于 c语言的编译 和编译后程序的运行 分类: 嵌入式开发学习 2011-03-29 19:57 909人阅读 评论(0) 收藏
- C++学习笔记1——安装GNU编译器,编译运行第一个程序
- 关于C++程序编译出现error C2143: syntax error : missing ';' before 'type'的解决办法
- 关于C++编译的程序无法在新一台电脑上运行总结
- 菜鸟C++精髓学习笔记--C++程序内部执行过程(预处理、编译、链接过程的作用)
- [MFC学习之C++基础] 孙鑫视频中第三讲中提到的小测试程序(关于基类和子类的继承关系)
- 关于Linux下C/C++程序编译
- 关于C++程序编译出现error C2143: syntax error : missing ';' before 'type'的解决办法
- 关于Linux下C/C++程序编译
- c++学习笔记(1)——环境搭建、经典教程推荐及 Visual Studio 2005/2008中如何编译和运行C++程序
- 关于Basic程序解释器及编译原理的简单化(2)---C++封装好的Basic解释器
- 关于C++编译的程序无法在新一台电脑上运行总结
- 关于 TerminateProcess函数 在c++的进程中的学习而发现VS2008的编译安全问题
- LISP 学习笔记 (三) -编辑,加载和编译LISP程序