c++程序编译后自动生成的文件有什么用,分别解释下

c++程序编译后自动生成的文件有什么用,分别解释下,第1张

1, PCH文件

预编译头文件(一般扩展名为PCH),是把一个工程中较稳定的代码预先编译好放在一个文件(PCH)里这些预先编译好的代码可以是任何的C/C++代码--甚至可以是inline函数,只它们在整个工程中是较为稳定的,即在工程开发过程中不会经常被修改的代码

为什么需要预编译头文件一言以蔽之:提高编译速度一般地,编译器以文件为单位编译,如果修改了一工程中的一个文件则所有文件都要重新编译,包括头文件里的所有东西(egMacro宏,Preprocessor预处理),而VC程序中,这些头文件中所包括的东西往往是非常大的,编译之将占很长的时间但它们又不常被修改,是较稳定的,为单独的一个小文件而重新编译整个工程的所有文件导致编译效率下降,因此引入了PCH文件

如何使用预编译头文件以提高编译速度要使用预编译头文件,必须指定一个头文件(H),它包含我们不会经常修改的代码和其他的头文件,然后用这个头文件(H)来生成一个预编译头文件(PCH)VC默认的头文件就是StdAfxh,因为头文件是不能编译的,所以我们还需要一个CPP文件来作桥梁,VC默认的文件为StdAfxcpp,这个文件里只有一句代码就是:#include "StdAfxh"接下来要用它生成PCH文件,涉及到几个重要的预编译指令:/Yu,/Yc,/Yx,/Fp简单地说,/Yc是用来生成PCH文件的编译开关在Project->setting->C/C++的Category里的Precompiled Header,然后在左边的树形视图中选择用来编译生成PCH文件的CPP文件(默认即StdAfxcpp)你就可以看到/Yc这个开关,它表示这个文件编译了以后是否生成PCH文件(可能/Yc的c表示create)/Fp指令指定生成的PCH文件的名字及路径(可能/Fp的p代表path)/Yu的u即use使用,工程中只要包括了H文件的文件都会有这个/Yu指令如果选择自动Automatic的话则原来为/Yc的地方就换成了/Yx指令如果选择自动,则每次编译时编译器会看以前有没有生成过PCH文件,有则不现生成否则就再次编译产生PCH文件

注意:

A,实际上,由Appzard项目向导生成的默认的头文件及CPP文件StdAfxh和StdAfxcpp可以是任何名字的原因很简单但如果你要这样做就要记得修改相应的Project->setting下的几个预编译指令(/Yc,/Yu,/Yx,/Fp)的参数

B在任何一个包括了将要预编译的头文件而使用了PCH文件的工程文件的开头,一定必须要是在最开头,你要包含那个指定生成PCH文件的H文件(通过CPP文件包括,默认为StdAfxcpp),如果没包括将产生我最开头产生的错误如果不是在最开头包括将产生让你意想不到的莫名其妙错误,如若不信,盍为试之

C预编译文件PCH生成之很耗时间,而且生成之后它也很占磁盘空间,常在5-6M,注意项目完成之后及时清理无用的PCH文件以节约磁盘空间

D如果丢了或删了PCH文件而以后要再修改工程文件时,可将指定的/Yc的CPP文件(默认为StdAfxcpp)重新编译一次即可再次生成PCH文件,不用傻傻的按F7或Rebuild All

2, NCB文件

ncb 无编译浏览文件(no compile browser)。当自动完成功能出问题时可以删除此文件。build后会自动生成

3, OBJ文件

目标文件,一般是程序编译后的二进制文件,再通过链接器和资源文件链接就成exe文件了。

OBJ只给出了程序的相对地址,而EXE是绝对地址。

4, PDB文件

程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置进行增量链接。当以 /ZI 或 /Zi(用于 C/C++)生成时,将创建一个 PDB 文件。

在 Visual C++ 中,/Fd 选项用于命名由编译器创建的PDB 文件。当使用向导在Visual Studio 中创建项目时,/Fd 选项被设置为创建一个名为 projectPDB 的 PDB。

如果使用生成文件创建 C/C++ 应用程序,并指定 /ZI 或 /Zi 而不指定 /Fd 时,则最终将生成两个 PDB 文件:

VC80PDB (更笼统地说就是 VCx0PDB,其中 x 表示 Visual C++ 的版本。)该文件存储各个 OBJ 文件的所有调试信息并与项目生成文件驻留在同一个目录中。

projectPDB 该文件存储 exe 文件的所有调试信息。对于C/C++,它驻留在 \debug 子目录中。

每当创建 OBJ 文件时,C/C++ 编译器都将调试信息合并到 VCx0PDB 中。插入的信息包括类型信息,但不包括函数定义等符号信息。因此,即使每个源文件都包含公共头文件(如 <windowsh>),这些头文件中的 typedef 也只存储一次,而不是在每个 OBJ 文件中都存在。

链接器将创建 projectPDB,它包含项目的 EXE 文件的调试信息。projectPDB文件包含完整的调试信息(包括函数原型),而不仅仅是在 VCx0PDB 中找到的类型信息。这两个 PDB 文件都允许增量更新。链接器还在其创建的 exe 或 dll 文件中嵌入 pdb 文件的路径。

Visual Studio 调试器使用 EXE 或 DLL 文件中的PDB 路径查找 projectPDB 文件。如果调试器在该位置无法找到 PDB 文件或者如果路径无效(例如,如果项目被移动到了另一台计算机上),调试器将搜索包含 EXE 的路径,即在“选项”对话框(“调试”文件夹,“符号”节点)中指定的符号路径。调试器不会加载与所调试的二进制不匹配的 PDB。

5, ILK文件

在增量链接时,LINK 更新在第一次增量链接期间创建的 ilk 状态文件。该文件和 exe文件或 dll 文件具有相同的基名称,并具有扩展名 ilk。在后面的增量链接期间,LINK 更新 ilk 文件。如果缺少 ilk 文件,则 LINK 执行完全链接并创建新的 ilk 文件。如果 ilk 文件无法使用,则 LINK 执行非增量链接。有关增量链接的详细信息,请参见渐进式链接(/INCREMENTAL) 选项。

6, MAP文件

Windows和Linux系统下都有map文件,map文件一般是用来保存符号的地址信息。这里的符号一般是指函数名及变量(局部、全局)。根据这个地址信息,便可以把地址翻译成相应的符号,很多系统工具、debug方法都要用到这种信息。

(一)一个程序编译完以后内容会分成两大类保存,一类是code,一类是data:

(1)code指程序代码,常存在text section

(2)data指存程序中声明的变量,常存在data section,未初始化的变量会被存在bss section。

(二)Windows

(1)单个模块的map文件

在Windows下每一个模块(dll/exe)对应一个map文件,只需编译时打开相应的选项即可。

visual studio中方法:右击工程,选择Properties,然后选择 Configuration Properties -Linker - Debugging,将Generate Map File项改成Yes。

编译后在debug/release目录里便可以找到与应用程序同名的map文件。

如下为map文件内容:

Timestamp is4b9603e2 (Tue Mar 09 16:16:34 2010) //这个是时间戳,每次编译都不同,后面符号对应的地址一般也不同。

Preferred loadaddress is 00010000 //这是编译时的预装载地址,实际上模块被加载的地址可能跟这个不同,所以来确定某个地址对应哪个符号信息的时候,还需要知道该模块加载在内存的真正起始地址,然后根据偏移量来确定。

Start Length Name Class

0001:00000000 001c3950H text CODE ==》存放程序代码

0003:000008b8000af67cH data DATA ==》初始化的变量

0003:000aff40003930b1H bss DATA ==》未初始化的变量

(2) *** 作系统总的map文件:不知道有没有。

(3)dumpbin

dumpbin是一个反汇编工具,可以输出exe/dll文件的许多信息。

dumpbin /allyourmodulename > atxt 可以把所有的信息保存在一个atxt中,里面可以找到时间戳、原debug路径信息及函数列表等。

如下:

FILE HEADERVALUES

1C2 machine (Thumb)

6 number of sections

49EC0BAE time date stamp Mon Apr 2013:44:14 2009 //时间戳

0 file pointer to symbol table

0 number of symbols

E0 size of optional header

2102 characteristics

Executable

32 bit word machine

DLL

OPTIONAL HEADERVALUES

10B magic # (PE32)

900 linker version

53E00 size of code

76A00size of initialized data

0 size of uninitialized data

502ACentry point (100502AC)

1000 base of code

55000 base of data

10000000 image base (10000000 to100CDFFF)

1000 section alignment

200 file alignment

501 operating system version

000 image version

501 subsystem version

0 Win32 version

CE000 size of image

400 size of headers

其中 10000000 image base (10000000 to 100CDFFF)是重要的信息,与map file中的 Preferred load address is10000000 意义相同。

DebugDirectories

Time Type Size RVA Pointer

-------- ------ -------- -------- --------

49EC0BAE cv 81 000020FC CFC Format: RSDS, {A5C699F0-C26D-427E-BC54-3504731BA9B8}, 1,d:\Projects\Final\MyUsbToPc_CPL\MyUsbToPc\Windows Mobile 6 Professional SDK(ARMV4I)\Debug\MyUsbToPcpdb //原编译路径

Begin End Prolog Excpt 32bit Fixup Function Name

0000000010001000 10001040 10001010 N Y Y DllMain

0000000810001040 10001064 10001050 N Y Y InitApplet@@YAHPAUHWND__@@@Z (int __cdecl InitApplet(struct HWND__))

0000001010001064 10001068 10001064 N Y Y TermApplet@@YAXXZ (void __cdecl TermApplet(void))

0000001810001068 100013DC 10001078 N Y Y CPlApplet

00000020 1000141C 100014B4 10001420 N Y Y _DllMainCRTStartup

00000028100014B4 100014BC 100014B4 N Y Y GetCurrentProcess

00000030100014BC 100014F0 100014C0 N Y Y

00000038 100014F0 1000155C 100014F4 N Y Y _cinit

00000040 1000155C 10001660 10001560 N Y Y

0000004810001660 10001678 10001664 N Y Y exit

0000005010001678 10001690 1000167C N Y Y _exit

0000005810001690 100016AC10001694 N Y Y _cexit

00000060 100016AC 100016F8 100016B0 N Y Y _c_exit

begin栏对应的地址与map里的地址是一致的,非常类似于map文件。

注意:很多exe或dll在编译时时将此信息隐藏的,Function Name会变成空的

(三)Linux

(1)单个模块的map文件

暂还不清楚,大家知道的请告知。

(2) *** 作系统总的map文件

linux系统编译Image后会生成一个systemmap,里面存了被编译进内核的符号信息,不同次的编译生成的systemmap会有差异。

因为是 *** 作系统的符号信息,装载的地址都是固定的,所以不像windows单个模块那样靠偏移量定位,直接通过地址就可以直接找到对应的符号。

其内容的重要的几个符号如下:

_stext//代码段开始

_etext//代码段结束

__data_start//初始化的数据开始

_edata//初始化的数据结束

__bss_start//未初始化数据开始

_end//全部结束

Linux相对windows有个很重要的不同是,linux启动后在proc\kallsyms里也有一份类似Map文件的信息,cat命令可看到其内容,有了这个就可以得到任何一个内核的符号(变量及函数名)的地址信息,而不需要在编译完内核后特意保存map文件,这真是一个巨大的宝藏。

而且,proc\kallsym的信息比systemmap多,在最后会有module部分的符号信息,这些信息会随着系统的变化而变化。

(3)nm命令

nm命令用来显示某个可执行文件的符号信息。符号信息中会包含全局变量(比如下面的xyz)和函数名(比如下面的main),还有一些编译器插入的符号(比如下面的__data_start,__bss_start)

第二列表示符号的属性,其中大写代表global,小写代表local

Usage: nm[option(s)] [file(s)]

List symbols in[file(s)] (aout by default)

示例:

nm helo

08049f20 d_DYNAMIC

08049ff4 d_GLOBAL_OFFSET_TABLE_

080484ec R_IO_stdin_used

w _Jv_RegisterClasses

08049f10 d__CTOR_END__

08049f0c d__CTOR_LIST__

08049f18 D__DTOR_END__

08049f14 d__DTOR_LIST__

08048500 r__FRAME_END__

08049f1c d__JCR_END__

08049f1c d__JCR_LIST__

0804a020 A__bss_start

0804a00c D__data_start

080484a0 t __do_global_ctors_aux

08048340 t__do_global_dtors_aux

0804a010 D__dso_handle

w __gmon_start__

0804849a T __i686get_pc_thunkbx

08049f0c d__init_array_end

08049f0c d__init_array_start

08048430 T__libc_csu_fini

08048440 T__libc_csu_init

U __libc_start_main@@GLIBC_20

0804a020 A _edata

0804a028 A _end

080484cc T _fini

080484e8 R_fp_hw

08048298 T _init

08048310 T_start

0804a020 bcompleted6635

0804a00c Wdata_start

0804a024 bdtor_idx6637

080483a0 t frame_dummy

080483c4 T main

U printf@@GLIBC_20

0804a014 D x

0804a018 D y

0804a01c D z

heloc如下:

#include<stdioh>

int x = 10;

int y = 20;

int z = 30;

extern int__data_start;//这里引用了编译器插入的符号

int main(void)

{

int ds = &__data_start;

printf("%p\n", ds);

printf("now x = %d\n", x);

ds+=3;

ds = 100;

printf("now x = %d\n", x);

}

7, IDB文件

The compiler savesstate information from the first compile in the project’s IDB file (the default name is projectIDB or VC60IDBfor files compiled without a project)

The compiler usesthis state information to speed subsequent compiles

8, SLN文件

Visual StudioSolution 通过为环境提供对项目、项目项和解决方案项在磁盘上位置的引用,可将它们组织到解决方案中。

c++程序在编译后,在目标路径下会生成多个文件:

Debug文件夹(exe,ilk,obj,pch,pdb,idb,,pdb),cpp,dsp,ncb,plg。

1、exe:是生成的可执行文件。

2、ilk:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息。

3、obj:是目标文件,源程序编译后的产物。

4、pch:全称是PreCompiled Header,就是预先编译好的头文件。

5、idb:文件保存的信息,使编译器在重新编译的时候只重编译最新改动过的函数和只对最新类定义改动过的源文件进行重编译,以提高编译速度。

6、pdb:全称是Program DataBase,即程序数据库文件,用来记录调试信息。

扩展资料:

工作原理:

C++语言的程序因为要体现高性能,所以都是编译型的。但其开发环境,为了方便测试,将调试环境做成解释型的。即开发过程中,以解释型的逐条语句执行方式来进行调试,以编译型的脱离开发环境而启动运行的方式来生成程序最终的执行代码。

生成程序是指将源码(C++语句)转换成一个可以运行的应用程序的过程。如果程序的编写是正确的,那么通常只需按一个功能键,即可搞定这个过程。该过程实际上分成两个步骤。

第一步是对程序进行编译,这需要用到编译器(compiler)。编译器将C++语句转换成机器码(也称为目标码);如果这个步骤成功,下一步就是对程序进行链接,这需要用到链接器(linker)。链接器将编译获得机器码与C++库中的代码进行合并。

参考资料来源:百度百科-C++

程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置进行增量链接。在使用 /debug 生成时,会创建一个 PDB 文件 (Visual Basic/C#)。可以使用 /debug:full 或 /debug:pdbonly 生成 Visual Basic 和 Visual C# 应用程序。使用 /debug:full 生成将产生可调试的代码。使用 /debug:pdbonly 生成将产生 PDB,但是不会产生通知 JIT 编译器调试信息可用的 DebuggableAttribute。如果您想为不希望其成为可调试的发布版本生成 PDB,请使用 /debug:pdbonly。

Visual Studio 调试器使用 EXE 或 DLL 文件中的 PDB 路径查找 projectpdb 文件。如果调试器无法在该位置找到 PDB 文件,或者该路径无效(例如,如果项目被移动到了另一台计算机上),调试器将搜索包含 EXE 的路径,该 EXE 后跟“选项”对话框中指定的符号路径。该路径通常是“符号”节点中的“调试”文件夹。调试器不会加载与所调试的二进制不匹配的 PDB。

C#文件后缀名详解

sln:解决方案文件,为解决方案资源管理器提供显示管理文件的图形接口所需的信息。

csproj:项目文件,创建应用程序所需的引用、数据连接、文件夹和文件的信息。

aspx:Web 窗体页由两部分组成:视觉元素(HTML、服务器控件和静态文本)和该页的编程逻辑。Visual Studio 将这两个组成部分分别存储在一个单独的文件中。视觉元素在aspx 文件中创建。

ascx:ASPNET的用户控件(也叫做“pagelets”),是作为一种封装了特定功能和行为(这两者要被用在Web应用程序的各种页面上)的Web页面被开发的。一个用户控件包含了HTML、代码和其他Web或者用户控件的组合,并在Web服务器上以自己的文件格式保存,其扩展名是ascx。ASPNET里的缺省配置并不允许Web客户端通过URL来访问这些文件,但是这个网站的其他页面可以集成这些文件里所包含的功能。

aspxcs:Web 窗体页的编程逻辑位于一个单独的类文件中,该文件称作代码隐藏类文件(aspxcs)。

cs: 类模块代码文件。业务逻辑处理层的代码。

asax:Globalasax 文件(也叫做 ASPNET 应用程序文件)是一个可选的文件,该文件包含响应ASPNET 或 >

PDB文件物理结构在我们目前使用的掌上电脑中,Palm *** 作系统由于其功能强大、应用软件多等特点,占有很大的比例。PDB文件是Palm OS *** 作系统上数据文件类型。一般我们在使用Palm系统的电子书时都会遇到这种文件,一般用于电子书或手机电子书 pdb是Palm DataBase的缩写,Palm OS所用文件的扩展名为pdb。还表示碳氧同位素标准样品以及可编程延迟模块,是DSP中的一种模块,可以用来计数和延时。

可以使用PalmReader打开。 如果想把PDB文件转换成TXT文件查看,可以使用WavePDB转。

PC端的PDB文件查看软件不多,PDBingo1504是英文界面,中文内容也显示不出,这样就很不方便。并且一些电子图书也只能在模拟器上看,如果碰到不同内码的汉字更是麻烦

PDB文件阅读器 >

Android中打开应用的时候,如果选择了始终以后,每次都会使用默认的来启动,如果需要修改默认打程序,需要按以下步骤清除,以下为清除浏览器为例:

1在手机待机桌面点击 Menu键,然后选择 设置 。

2点击 应用程序。

3点击管理应用程序。

4找到并点击已经设置为默认程序的浏览器。

5点击 清除默认值 ,即可清除Android的默认打开程序。

以上就是关于c++程序编译后自动生成的文件有什么用,分别解释下全部的内容,包括:c++程序编译后自动生成的文件有什么用,分别解释下、c++编译后产生的一些文件是什么、VS2010,在bin下面的debug文件中没有exe文件,只有dll文件和pdb文件。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9597734.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存