1、vc+6.0 详解大家可能一直在用 VC 开发软件,但是对于这个编译器却未必很了解。原因是多方面的。大多数情况下,我们只停留在“使用”它,而不会想去“了解”它。因为它只是一个工具,我们宁可把更多的精力放在 C+语言和软件设计上。我们习惯于这样一种“模式”:建立一个项目,然后写代码,然后编译,反反复复调试。但是,所谓:“公欲善其事,必先利其器” 。如果我们精于 VC 开发环境,我们是不是能够做得更加游刃有余呢? 闲话少说。我们先来看一下 VC 的处理流程,大致分为两步:编译和连接。源文件通过编译生成了.obj 文件;所有.obj 文件和.lib文件通过连接生成.exe 文件或.dll 文件。下面
2、,我们分别讨论这两个步骤的一些细节。 编译参数的设置。主要通过 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“ /Fp“Debug/WritingDlgTest.pch“ /Yu“stdafx.h“ /Fo“Debug/“ /Fd“Debug/“ /FD /GZ /c 各个参数代表的意义,可以参考 Msdn。
3、比如/nologo 表示编译时不在输出窗口显示这些设置(我们可以把这个参数去掉来看看效果)等等。一般我们不会直接修改这些设置,而是通过这一页最上面的 Category 中的各项来完成。 1) General:一些总体设置。Warning level 用来控制警告信息,其中 Level 1 是最严重的级别;Warnings as errors 将警告信息当作错误处理;Optimizations 是代码优化,可以在 Category 的Optimizations 项中进行更细的设置;Generate browse info 用以生成.sbr 文件,记录类、变量等符号信息,可以在 Category
4、的Listing Files 项中进行更多的设置。Debug info,生成调试信息:None,不产生任何调试信息(编译比较快) ;Line Numbers Only,仅生成全局的和外部符号的调试信息到.OBJ 文件或.EXE 文件,减小目标文件的尺寸;C 7.0- Compatible,记录调试器用到的所有符号信息到.OBJ 文件和.EXE 文件;Program Database,创建.PDB 文件记录所有调试信息;Program Database for “Edit char *tBuffer = “This is a character buffer“; sBuffer 和 tBuffe
5、r 指向的是同一块内存空间;Enable Function-Level Linking ,告诉编译器将各个函数按打包格式编译;Enables minimal rebuild,通过保存关联信息到.IDB 文件,使编译器只对最新类定义改动过的源文件进行重编译,提高编译速度;Enable Incremental Compilation,同样通过.IDB 文件保存的信息,只重编译最新改动过的函数;Suppress Startup Banner and Information Messages,用以控制参数是否在 output 窗口输出。 5) Listing Files:Generate browse
6、 info 的功能上面已经提到过。这里可以进行更多的设置。Exclude Local Variables 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
7、Source 生成机器码、源代码和汇编代码文件(.COD 扩展名) 。Listing file name 为生成的信息文件的路径,一般为 Debug 或 Release 目录下,生成的文件名自动取源文件的文件名。 6) Optimizations:代码优化设置。可以选择 Maximize Speed生成最快速的代码,或 Minimize Size 生成最小尺寸的程序,或者Customize 定制优化。定制的内容包括: Assume No Aliasing,不使用别名(提高速度) ; Assume Aliasing Across Function Calls,仅函数内部不使用别名; Global
8、 Optimizations,全局优化,比如经常用到的变量使用寄存器保存,或者循环内的计算优化,如 i = -100; while( i Settings-Link 页来完成。我们可以看到这一页的最下面 Project Options中的内容,一般如下: /nologo /subsystem:windows /incremental:yes /pdb:“Debug/WritingDlgTest.pdb“ /debug /machi ne:I386 /out:“Debug/WritingDlgTest.exe“ /pdbtype:sept 下面我们分别来看一下 Category 中的各项设置。
9、1) General:一些总体设置。可以设置生成的文件路径、文件名;连接的库文件;Generate debug info,生成 Debug 信息到.PDB文件(具体格式可以在 Category-Debug 中设置) ;Ignore All Default Libraries,放弃所有默认的库连接;Link Incrementally,通过生成. ILK 文件实现递增式连接以提高后续连接速度,但一般这种方式下生成的文件(EXE 或 DLL)较大;Generate Mapfile,生成.MAP 文件记录模块相关信息;Enable Profiling,这个参数通常与 Generate Mapfile
10、 参数同时使用,而且如果产生 Debug 信息的话,不能用.PDB 文件,而且必须用Microsoft Format。 2) Customize:这里可以进行使用程序数据库文件的设置。Force File Output ,强制产生输出文件(EXE 或 DLL) ;Print Progress Messages,可以将连接过程中的进度信息输出到 Output窗口。 3) Debug:设置是否生成调试信息,以及调试信息的格式。格式可以有 Microsoft Format、COFF Format(Common Object File Format)和 Both Formats 三种选择;Separa
11、te Types,表示将Debug 格式信息以独立的.PDB 文件存放,还是直接放在各个源文件的.PDB 文件中。选中的话,表示采用后者的方式,这种方式调试启动比较快。 4) Input:这里可以指定要连接的库文件,放弃连接的库文件。还可以增加额外的库文件目录,一般是相对于本项目的目录,如.Lib。Force Symbol References,可以指定连接特定符号定义的库。5) Output:Base Address 可以改变程序默认的基地址(EXE 文件默认为 0x400000,DLL 默认为 x10000000) ,操作系统装载一个程序时总是试着先从这个基地址开始。Entry-Point
12、 Symbol 可以指定程序的入口地址,一般为一个函数名(且必须采用_stdcall 调用约定) 。一般 Win32 的程序,EXE 的入口为 WinMain,DLL 的入口为DllEntryPoint;最好让连接器自动设置程序的入口点。默认情况下,通过一个 C 的运行时库函数来实现:控制台程序采用mainCRTStartup (或 wmainCRTStartup)去调用程序的 main (或wmain)函数;Windows 程序采用 WinMainCRTStartup (或 wWinMainCRTStartup)调用程序的 WinMain (或 wWinMain,必须采用_stdcall 调
13、用约定);DLL 采用_DllMainCRTStartup 调用DllMain 函数(必须采用_stdcall 调用约定) 。Stack allocations,用以设置程序使用的堆栈大小(请使用十进制) ,默认为 1 兆字节。Version Information 告诉连接器在 EXE 或 DLL 文件的开始部分放上版本号。 值得注意的是,上面各个参数是大小写敏感的;在参数后加上“-”表示该参数无效;各个参数值选项有“*”的表示为该参数的默认值;可以使用页右上角的“Reset”按钮来恢复该页的所有默认设置。 其它一些参数设置 1) Project-Settings-General,可以设置连
14、接 MFC 库的方式(静态或动态) 。如果是动态连接,在你的软件发布时不要忘了带上MFC 的 DLL。 2) Project-Settings-Debug,可以设置调试时运行的可执行文件,以及命令行参数等。 3) Project-Settings-Custom Build,可以设置编译/连接成功后自动执行一些操作。比较有用的是,写 COM 时希望 VC 对编译通过的 COM 文件自动注册,可以如下设置: Description: Register COM Commands: regsvr32 /s /c $(TargetPath) echo regsvr32 exe.time $(Target
15、Dir)$(TargetName).trg Outputs: $(TargetDir)$(TargetName).trg 4) Tools-Options-Directories,设置系统的Include、Library 路径。 一些小窍门 1) 有时候,你可能在编译的时候,计算机突然非法关机了(可能某人不小心碰了电源或你的内存不稳定等原因) 。当你重启机器后打开刚才的项目,重新进行编译,发现 VC 会崩掉。你或许以为你的VC 编译器坏了,其实不然(你试试编译其它项目,还是好的!) ,你只要将项目的.ncb、.opt、.aps、.clw 文件以及 Debug、Release目录下的所有文件都删
16、掉,然后重新编译就行了。 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。应该可以解决问题。