《2022年VC.编译器介绍 .pdf》由会员分享,可在线阅读,更多相关《2022年VC.编译器介绍 .pdf(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、VC6.0 编译器介绍VC 的处理流程,大致分为两步:编译和连接。源文件通过编译生成了.obj 文件;所有 .obj文件和 .lib 文件通过连接生成.exe 文件或 .dll 文件。下面,我们分别讨论这两个步骤的一些细节。编译参数的设置。主要通过VC 的菜单项Project-Settings-C/C+ 页来完成。我们可以看到这一页的最下面Project Options 中的内容,一般如下:/nologo /MDd /W3 /Gm /GX /ZI /Od /D WIN32 /D _DEBUG /D _WINDOWS /D _AFXDLL /D _M BCS /FpDebug/WritingDl
2、gTest.pch /Yustdafx.h /FoDebug/ /FdDebug/ /FD /GZ /c 各个参数代表的意义,可以参考Msdn。比如 /nologo 表示编译时不在输出窗口显示这些设置(我们可以把这个参数去掉来看看效果)等等。一般我们不会直接修改这些设置,而是通过这一页最上面的Category 中的各项来完成。1) General:一些总体设置。Warning level 用来控制警告信息,其中Level 1 是最严重的级别; Warnings as errors 将警告信息当作错误处理;Optimizations是代码优化,可以在Category 的 Optimization
3、s 项中进行更细的设置;Generate browse info 用以生成 .sbr 文件,记录类、变量等符号信息,可以在Category 的 Listing Files 项中进行更多的设置。Debug info ,生成调试信息:None,不产生任何调试信息(编译比较快);Line Numbers Only ,仅生成全局的和外部符号的调试信息到.OBJ 文件或 .EXE文件,减小目标文件的尺寸;C 7.0- Compatible ,记录调试器用到的所有符号信息到.OBJ 文件和 .EXE 文件; Program Database,创建 .PDB 文件记录所有调试信息;Program Datab
4、ase for Edit & Continue,创建 .PDB 文件记录所有调试信息,并且支持调试时编辑。2) C+ Language :pointer_to_member representation 用来设置类定义/引用的先后关系,一般为Best-Case Always表示在引用类之前该类肯定已经定义了;Enable Exception Handling ,进行同步的异常处理;Enable Run-Time Type Information迫使编译器增加代码在运行时进行对象类型检查;Disable Construction Displacements ,设置类构造 /析构函数调用虚函数问题
5、。3) Code Generation: Processor表示代码指令优化, 可以为 80386、 80486、 Pentium、 Pentium Pro,或者 Blend 表示混合以上各种优化。Use run-time library用以指定程序运行时使用的运行时库 (单线程或多线程,Debug 版本或 Release版本),有一个原则就是,一个进程不要同时 使 用 几 个 版 本 的 运 行 时 库 。 Single-Threaded , 静 态 连 接LIBC.LIB库 ; Debug Single-Threaded,静态连接 LIBCD.LIB库;Multithreaded ,静态连
6、接 LIBCMT.LIB库;Debug Multithreaded ,静态连接LIBCMTD.LIB库; Multithreaded DLL ,动态连接MSVCRT.DLL库; Debug Multithreaded DLL ,动态连接MSVCRTD.DLL库。连接了单线程库就不支持多线程调用,连接了多线程库就要求创建多线程的应用程序。Calling convention 可以用来设定调用约定,有三种:_cdecl、_fastcall 和_stdcall。各种调用约定的主要区别在于,函数调用时, 函数的参数是从左到右压入堆栈还是从右到左压名师资料总结 - - -精品资料欢迎下载 - - - -
7、 - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - 入堆栈; 在函数返回时, 由函数的调用者来清理压入堆栈的参数还是由函数本身来清理;以及在编译时对函数名进行的命名修饰(可以通过Listing Files 看到各种命名修饰方式)。 Struct member alignment 用以指定数据结构中的成员变量在内存中是按几字节对齐的,根据计算机数据总线的位数, 不同的对齐方式存取数据的速度不一样。这个参数对数据包网络传输等应用尤为重要,不是存取速度问题,而是数据位的精确定义问题,一般在程序
8、中使用#pragma pack 来指定4) Customize: Disable Language Extensions, 表示不使用微软为标准C做的语言扩展; Eliminate Duplicate Strings ,主要用于字符串优化(将字符串放到缓充池里以节省空间),使用这个参数,使得char *sBuffer = This is a character buffer; char *tBuffer = This is a character buffer; sBuffer 和 tBuffer 指向的是同一块内存空间;Enable Function-Level Linking ,告诉编译器
9、将各个函数按打包格式编译;Enables minimal rebuild,通过保存关联信息到.IDB 文件,使编译器只对最新类定义改动过的源文件进行重编译,提高编译速度;Enable Incremental Compilation ,同样通过 .IDB 文件保存的信息,只重编译最新改动过的函数;Suppress Startup Banner and Information Messages,用以控制参数是否在output 窗口输出。5) Listing Files : Generate browse info 的功能上面已经提到过。这里可以进行更多的设置。Exclude Local Varia
10、bles from Browse Info 表示是否将局部变量的信息放到.SBR 文件中。Listing file type可以设置生成的列表信息文件的内容:Assembly-Only Listing仅生成汇编代码文件 (.ASM 扩展名);Assembly With Machine Code 生成机器代码和汇编代码文件(.COD扩展名); Assembly With Source Code 生成源代码和汇编代码文件(.ASM 扩展名); Assembly, Machine Code,and Source 生成机器码、源代码和汇编代码文件(.COD 扩展名)。 Listing file nam
11、e 为生成的信息文件的路径,一般为Debug 或 Release目录下,生成的文件名自动取源文件的文件名。6) Optimizations :代码优化设置。可以选择Maximize Speed 生成最快速的代码,或Minimize Size 生成最小尺寸的程序,或者Customize 定制优化。定制的内容包括:Assume No Aliasing ,不使用别名(提高速度);Assume Aliasing Across Function Calls ,仅函数内部不使用别名;Global Optimizations ,全局优化,比如经常用到的变量使用寄存器保存,或者循环内的计算优化,如i = -1
12、00; while( i 0 ) i += x + y; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - 会被优化为i = -100; t = x + y; while( i Settings-Link页来完成。我们可以看到这一页的最下面Project Options 中的内容,一般如下:/nologo /subsystem:windows /incremental:yes /pdb:Debug/WritingDlgTest.p
13、db /debug /machi ne:I386 /out:Debug/WritingDlgTest.exe /pdbtype:sept 下面我们分别来看一下Category 中的各项设置。1) General:一些总体设置。 可以设置生成的文件路径、文件名;连接的库文件; Generate debug info, 生成 Debug 信息到 .PDB 文件 (具体格式可以在Category-Debug 中设置); Ignore All Default Libraries ,放弃所有默认的库连接;Link Incrementally ,通过生成 . ILK 文件实现递增式连接以提高后续连接速度,
14、但一般这种方式下生成的文件(EXE 或 DLL )较大;Generate Mapfile ,生成 .MAP文件记录模块相关信息;Enable Profiling ,这个参数通常与Generate Mapfile 参数同时使用, 而且如果产生Debug 信息的话,不能用.PDB 文件,而且必须用 Microsoft Format 。2) Customize:这里可以进行使用程序数据库文件的设置。Force File Output ,强制产生名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第
15、 3 页,共 5 页 - - - - - - - - - 输出文件( EXE 或 DLL ) ;Print Progress Messages ,可以将连接过程中的进度信息输出到Output 窗口。3) Debug: 设置是否生成调试信息,以及调试信息的格式。格式可以有Microsoft Format 、COFF Format (Common Object File Format )和 Both Formats 三种选择; Separate Types,表示将 Debug 格式信息以独立的.PDB 文件存放,还是直接放在各个源文件的.PDB 文件中。选中的话,表示采用后者的方式,这种方式调试启
16、动比较快。4) Input:这里可以指定要连接的库文件,放弃连接的库文件。还可以增加额外的库文件目录,一般是相对于本项目的目录,如.Lib 。 Force Symbol References,可以指定连接特定符号定义的库。5) Output:Base Address可以改变程序默认的基地址(EXE 文件默认为0 x400000,DLL默认为x10000000) ,操作系统装载一个程序时总是试着先从这个基地址开始。Entry-Point Symbol 可以指定程序的入口地址,一般为一个函数名(且必须采用_stdcall 调用约定)。一般 Win32 的程序, EXE 的入口为WinMain ,D
17、LL 的入口为 DllEntryPoint ;最好让连接器自动设置程序的入口点。默认情况下,通过一个C 的运行时库函数来实现:控制台程序采用mainCRTStartup ( 或 wmainCRTStartup) 去调用程序的main (或 wmain)函数; Windows 程序采用 WinMainCRTStartup (或 wWinMainCRTStartup) 调用程序的WinMain (或 wWinMain ,必须采用 _stdcall 调用约定 );DLL采用 _DllMainCRTStartup调用DllMain函数(必须采用_stdcall 调用约定)。Stack allocati
18、ons,用以设置程序使用的堆栈大小(请使用十进制),默认为 1 兆字节。 Version Information 告诉连接器在EXE 或 DLL 文件的开始部分放上版本号。值得注意的是,上面各个参数是大小写敏感的;在参数后加上“ -” 表示该参数无效;各个参数值选项有“*”的表示为该参数的默认值;可以使用页右上角的“Reset”按钮来恢复该页的所有默认设置。其它一些参数设置1) Project-Settings-General ,可以设置连接MFC 库的方式(静态或动态)。如果是动态连接,在你的软件发布时不要忘了带上MFC 的 DLL 。2) Project-Settings-Debug ,可
19、以设置调试时运行的可执行文件,以及命令行参数等。3) Project-Settings-Custom Build ,可以设置编译 /连接成功后自动执行一些操作。比较有用的是,写COM 时希望 VC 对编译通过的COM 文件自动注册,可以如下设置:Description: Register COM 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - Commands: regsvr32 /s /c $(TargetPath) echo
20、 regsvr32 exe.time $(TargetDir)$(TargetName).trg Outputs: $(TargetDir)$(TargetName).trg 4) Tools-Options-Directories ,设置系统的Include 、Library 路径。一些小窍门1) 有时候,你可能在编译的时候,计算机突然非法关机了(可能某人不小心碰了电源或你的内存不稳定等原因)。当你重启机器后打开刚才的项目,重新进行编译,发现VC 会崩掉。你或许以为你的VC 编译器坏了,其实不然(你试试编译其它项目,还是好的!) ,你只要将项目的 .ncb、.opt、.aps、.clw 文件
21、以及Debug、Release目录下的所有文件都删掉,然后重新编译就行了。2) 如果你想与别人共享你的源代码项目,但是把整个项目做拷贝又太大。你完全可以删掉以下文件:.dsw、 .ncb、.opt、.aps、.clw、 . plg 文件以及Debug、Release目录下的所有文件。3) 当你的 Workspace 中包含多个Project 的时候,你可能不能直观地、一眼看出来哪个是当前项目。可以如下设置:Tools-Options-Format ,然后在Category 中选择Workspace window ,改变其默认的字体(比如设成Fixedsys)就行了。4) 如何给已有的Project 改名字?将该Project 关掉。然后以文本格式打开.dsp文件, 替换原来的 Project 名字即可。5) VC6 对类成员的智能提示功能很有用,但有时候会失灵。你可以先关掉项目,将.clw和.ncb 删掉,然后重新打开项目,点击菜单项View-ClassWizard ,在弹出的对话框中按一下“Add All ”按钮;重新Rebuild All 。应该可以解决问题。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -
限制150内