C++ 编译过程简介
C/C++程序编译流程:
预处理->编译->汇编->链接
具体的就是:
源代码(source coprede)→预处理器(processor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→链接器(Linker)→可执行程序(executables)
C语言在linux下的基本流程如图:
1. 预处理
预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。
-
读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理
①将所有的“#define”删除,并且展开所有的宏定义
②处理所有的条件编译指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“endif”等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉。
③处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。
(注意:这个过程可能是递归进行的,也就是说被包含的文件可能还包含其他文件)
-
删除所有的注释
-
添加行号和文件名标识。
以便于编译时编译器产生调试用的行号信息及用于编译时产生的编译错误或警告时能够显示行号
-
保留所有的#pragma编译器指令
2. 编译
将预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。
3. 汇编
将编译完的汇编代码文件翻译成机器指令,并生成可重定位目标程序的.o文件,该文件为二进制文件,字节编码是机器指令。
汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。所以汇编器的汇编过程相对于编译器来讲比较简单,它没有复杂的语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译即可。
4. 链接
通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序。
由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。
将生成的.obj文件与库文件.lib等文件链接,生成可执行文件(.exe文件)
例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。
1.dll .obj .lib使用在windows平台下
.dll:动态链接库,作为共享函数库的可执行文件
.obj:对象文件,相当于源代码对应的二进制文件,未经重定位
.lib:可理解为多个obj的集合,本质与.obj相同
2 .so .o .a使用在linux平台下
.so:(share object)动态链接库,跟Windows平台类似
.o: 对象文件,相当于源代码对应的二进制文件
.a: 与.o类似,多个.o的集合
PDB
英文全称:Program Database File
中文全称:程序数据库 文件
问:Debug里有pdb,Release里也有pdb,他们有什么不同呢?为什么很多人都不喜欢pdb,欲除之而后快?
答:
Debug里的PDB是full,保存着调试和项目状态信息、有断言、堆栈检查等代码。
Release 里的PDB是pdb-only,基本上:出什么错了+错误在哪行。
因为很多人把PDB理解成:调试文件、Program Debug Database、会泄露代码机密,所以想将其删除,那只要在VS的 项目-->生成-->高级-->调试信息-->None便可
MSDN官方介绍:http://msdn.microsoft.com/zh-cn/library/ms241903.aspx
一句话: 调试程序用 详细点(copy过来的,将就着看吧): visual studio 调试需要pdb文件 在vs2005中新建了一个解决方案配置,但输出的dll去不能调试 原来是vs在生成dll时没有生成pdb文件,msdn上对pdb文件的描述是: DBG 文件是可移植可执行 (PE) 格式文件,该文件包含 Visual Studio 调试器的 Codeview 格式的调试信息(也可能是其他格式,视 DBG 的创建方式而定)。当没有某些代码的源(如库或 Windows API)时,DBG 文件允许调试。DBG 文件还允许执行 OLE RPC 调试。 DBG 文件已经由 PDB 文件替代,PDB 文件现在更常用于调试。 但是怎么生成pdb文件呢,命令行命令是/DEBUG 如何让vs在生成dll时一并生成pdb文件,需要设置对应项目的调试信息为full或pdb-only,当设为none时就不生成pdb文件了 项目调试信息的设置位置在:项目属性>生成>高级>调试信息 不过这种东西知不知道无所谓,微软做事就是这样,用着很方便,但你一旦要研究,就会发现他生成的东西多得跟shi一样的,看着都dan疼......
查看 |
visual studio里的文件后辍名解析。
2008-09-15 10:00
禁止Visual Studio编译时生成.vshost.exe、.pdb等文件
项目名称-->>右键-->>属性-->>调试-->>启用Visual Studio承载进程
把勾去掉即可
VS2005 在Release模式上实现了一些“特性”,默认会输出.pdb(Program Debug Database) 文件。 要恢复“Release”模式的本来面目,需要对每个project的属性进行一些设置:
Properties -> Build ->
1. Configuration :选为 Release
2. Advanced - > Debug Info :默认为“Full”,这就是所谓的新特性。把它设为Null,就是传统的Release模式了,即不包含任何debug信息。当然,也可以选择“pdb only”,不知道和“Full”有什么区别。。。。
=====================================================================