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”有什么区别。。。。
=====================================================================
LINK uses a PDB to hold debugging information for the .EXE file or .DLL file. The program’s PDB is both an output file and an input file, because LINK updates the PDB when it rebuilds the program. .clw文件记录了类的信息,如果classView中某个类不见了,重新生成该文件就可以了,方法:删除此文件,点击“建立类向导”,根据提示输入工程名称就可以了; .APS:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度。资源辅助文件。 |
C++ 编译过程简介的更多相关文章
- 转 C语言编译过程简介
C语言编译过程简介 C语言编译过程简介 刚开始接触编程的时候,只知道照书敲敲代码,一直都不知道为什么在windows平台下代码经过鼠标那样点击几下,程序的结果就会在那个黑色的屏幕上.现在找了个机会将C ...
- .NET框架源码解读之SSCLI编译过程简介
前文演示了编译SSCLI最简便的方法(在Windows下): 在“Visual Studio 2005 Command Prompt”下,进入SSCLI的根目录: 运行 env.bat 脚本准备环境: ...
- C语言编译过程简介
刚开始接触编程的时候,只知道照书敲敲代码,一直都不知道为什么在windows平台下代码经过鼠标那样点击几下,程序的结果就会在那个黑色的屏幕上.现在找了个机会将C语言的编译原理做一下小小的总结,这样也能 ...
- 【嵌入式开发】gcc 学习笔记(一) - 编译C程序 及 编译过程
一. C程序编译过程 编译过程简介 : C语言的源文件 编译成 可执行文件需要四个步骤, 预处理 (Preprocessing) 扩展宏, 编译 (compilation) 得到汇编语言, 汇编 (a ...
- gcc 学习笔记(一) - 编译C程序 及 编译过程
一. C程序编译过程 编译过程简介 : C语言的源文件 编译成 可执行文件需要四个步骤, 预处理 (Preprocessing) 扩展宏, 编译 (compilation) 得到汇编语言, 汇编 (a ...
- 第48章 MDK的编译过程及文件类型全解—零死角玩转STM32-F429系列
第48章 MDK的编译过程及文件类型全解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...
- 第48章 MDK的编译过程及文件类型全解
Frm: http://www.cnblogs.com/firege/p/5806134.html 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教 ...
- C语言笔记——简介与编译过程初探
序言 从今天起,详细说说C语言.这一年多,在大多数语言和技术之间转了一大圈,终于看清楚了事实,决心静下心来好好学学C语言.初学者会认为C语言是个入门用的东西,没有必要深入研究.但对计算机领域再稍加了解 ...
- OpenBLAS简介及在Windows7 VS2013上源码的编译过程
OpenBLAS(Open Basic Linear Algebra Subprograms)是开源的基本线性代数子程序库,是一个优化的高性能多核BLAS库,主要包括矩阵与矩阵.矩阵与向量.向量与向量 ...
随机推荐
- 使用Vue和djangoframwork完成登录页面构建 001
使用Vue和djangoframwork完成登录页面构建 001 环境的搭建 首先,我在我的电脑的F盘创建了一个文件夹 forNote,进入到这个文件夹中 F:\forNote> vue环境的搭 ...
- 为delphi程序添加脚本功能,用脚本控制delphi程序
使用微软的ActiveX Scripting技术,可以在应用程序中集成使用vbscript或这javascript脚本语言.在delphi中点击Component菜单的Import Activex C ...
- Hbase的rowkey设计
HBase的rowKey设计技巧 1.设计宗旨与目标 主要目的就是针对特定的业务模型,按照rowKey进行预分区设计,使之后面加入的数据能够尽可能的分散于不同的rowKey中.比如复合RowKey. ...
- (转)OpenFire源码学习之四:openfire的启动流程
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413233 openfire启动 ServerStarter 启动流程图: 启动的总入 ...
- java lambda filter写法
datas.stream().filter(m->!m.getSerialId().equals(setting.getSerialId())).collect(Collectors.toLis ...
- MFS分布式文件系统【2】MFS MASTER 部署
MFS版本 mfs-1.6.27 MFS-MASTER 192.168.1.190 MFS-CHUNKSERVER1 192.168.1.252 MFS-CHUNKSERVER2 192.168.1. ...
- js导出复杂表头(多级表头)的excel
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 多个串的最长公共子串 SPOJ - LCS2 后缀自动机
题意: 求多个串的最长公共子串 这里用的是O(n)的后缀自动机写法 我后缀数组的专题有nlog(n)写法的 题解: 对于其中的一个串建立后缀自动机 然后对于后缀自动机上面的每一个节点求出每一个节点最长 ...
- Java的GC是什么?做了什么?
Java GC是Java的垃圾回收机制 Java堆是被所有线程共享的一块内存区域,所有对象实例和数组都在堆上进行内存分配.为了高效的进行垃圾回收,虚拟机把堆内存分为新生代,老年代和永久代3个区域 新生 ...
- Oracle导出存储过程对象
$ pwd/home/oracle 导出存储过程 $ vi test.par INCLUDE=PROCEDURE:"IN ('P_TEST_LAST_DDL')" SCHEMAS= ...