打开或新建一个包含至少一个工程的Work space后,Visual C++的“Project”菜单中的“Settings…”命令就变为有效,选择它或者按下快捷键“Alt+F7”后便可调出如图3-12所示的工程设置 对话框,这里面的选项将影响整个工程的建立和调试,因此很重要,虽然在一般情况下,其中的大多数选项都不用改变,但了解一下它的含义能够消除我们心中存在 的神秘感,并加深我们对VC++工程的理解。
图3-12 工程设置对话框
在这个对话框中,左上方的下拉列表框用于选择一种工 程配置,包括有Win32 Debug、Win32 Release和All Configurations(指前两种配置一起),某些选项在不同的工程配置中有不同的默认值。左边的树形视图给出了当前工程所有的文件及分类情况。如 果我们把工程“Schedule”置为高亮显示,对话框的右边就会出现总共10个选项卡,其中列出了与工程有关的各种选项,不少选项卡中有一个Reset 按钮,按下它后可以把选项卡内的各项设置恢复到生成工程时的初始值。如果我们在树形视图中选择一个文件类或一个文件,那么对话框右边的选项卡会自动减少到 一个或两个,其中列出的都是与选中的文件类或文件有关的选项。下面我们就以Win32 Debug为例来看看与工程有关的10个选项卡各自的功能与含义。
3.3.1 General
这个选项卡比较简单,从上向下的第一个选项用于更改 使用MFC类库的方式,第二个选项用于指定在编译链接过程中生成的中间文件和输出文件的存放目录,对于调试版本来说,默认的目录是工程下面的 “Debug”子目录。最下面的第三个选项用于指定是否允许每种工程配置都有自己的文件依赖关系(主要指头文件),由于绝大多数工程的调试版本和发布版本 都具有相同的文件依赖关系,所以通常不需要更改该选项。具体的选项卡如图3-13所示。
图3-13 General选项卡
3.3.2 Debug
Debug选项卡中是一些与调试有关的选项,如图 3-14所示,由于选项比较多,它们被分成了几个类,我们可以从Category中选择不同的类别,选项卡就会切换显示出相应的选项,后面的C/C++和 Link选项卡也有这种情况。
在General类别中,我们可以指定要调试的可执 行文件名,如果正在编写的程序是一个DLL,那么应在此处指定一个用来调试该DLL的EXE文件。另外三个选项可以指定用于调试的工作目录,开始调试时给 程序传送的命令行参数,以及进行远程调试时可执行文件的路径。把类别切换到Additional DLLs后,我们可以指定在开始调试时是否为一些额外的DLL装载调试符号信息,只有装载了符号信息后才能跟踪进DLL。
图3-14 Debug选项卡
3.3.3 C/C++
C/C++选项卡控制着Visual C++的编译器,其中的选项比较多,也比较复杂,这里要重点介绍一下它。如图3-15所示,最下面有一个Project Options编辑框,里面列出的各种命令开关将会在开始编译时作为命令行参数传送给Visual C++的编译器,以便对编译过程进行控制。这些命令开关会跟随其他选项改变而改变,另外,如果我们知道某些命令开关,也可以直接在这个编辑框中输入,开关 所对应的选项会自动改变。
图3-15 C/C++选项卡
在General类别中,Warning level用于指定编译器显示警告的级别,None表示不显示任何警告,Leve l1表示只显示严重的警告,Leve l2表示显示比Leve l1次严重的警告,Leve l3表示显示比Leve l2次严重的警告,Leve l4则表示显示出所有的警告,包括那些安全忽略的警告,如果选中了Warnings as errors,那么显示的每一个警告都将会引起一个错误,这样在编译完毕后就无法启动连接器来进行连接。C/C++语言的语法相当复杂和严格,尽管编辑器 在产生了警告后并不会中断工程的建立过程,但警告信息往往表示程序在某些地方存在着潜在的问题,所以建议大家今后把警告等级设置成Leve 3,并尽量排除掉编译过程中产生的警告。Optimizations用于设置代码优化方式,优化的目的主要有提高运行速度和减小程序体积两种,但有时候这 两种目的是相互矛盾的。另外,在极少数情况下,不进行优化,程序能正常运行,打开了优化措施之后,程序却会出现一些莫名其妙的问题。其实这多半是程序中有 潜在的错误,关闭优化措施往往只是暂时解决问题。Debug info用于指定编译器产生的调试信息的类型,前面介绍过Visual C++支持即编即调功能,为了使用这一项功能,必须在这里选择生成“Program Database for Edit and Continue”类型的调试信息,而不能生成与老版本编译器兼容的调试信息。Preprocessor definitions是一些预先定义的宏名,MFC类库和Windows的头文件中大量使用了这些宏来设置条件编译。
C++ Language类别中的选项涉及到了C++语言的一些高级特性,包括有成员指针的表示方式、异常处理、运行时类型信息、构造位移等,它们的概念都比较深 奥,好在我们一般情况下都不用改变它们。Code Generation类别中的选项涉及如何生成目标代码,在这里我们可以选择目标处理器的类型、运行时库的类型、进行函数调用时参数的默认传递方式、结构 成员的对齐方式等,一般情况下保持默认值即可。在Customize类别中,从上到下6个选项的含义分别为:是否禁止使用Microsoft对C++的扩 展;是否允许函数级别的连接;是否消除重复的字符串;是否允许进行最小化的重建;是否允许递增编译方式;是否允许编译器在开始运行时向Output窗口中 输出自己的版本信息。其中第二、三两项为灰色是因为它们与即编即调功能不兼容,如果在General类别中选择生成其他类型的调试信息,那么就可以更改这 两个选项。
在Listing Files类别中,我们可以指定编译器生成浏览信息和列表文件(Listing file),前者可由浏览信息维护工具BSCMAKE生成浏览信息文件,后者则包含了C/C++源文件经过编译后对应的汇编指令。 Optimizations类别允许我们对优化措施进行更细微的控制,选择了Customize后,便可以选择进行哪几项优化,在Inline function expansion中我们可以指定对内联函数的扩展方式。Precompiled Headers类别中是关于预编译头文件的一些选项,一般情况下都不用更改。Preprocessor类别中是关于预处理的一些选择,我们可以在这里预先 定义一些宏名,指定部分或所有符号具有未定义状态,指定额外的包含文件所在的目录。
3.3.4 Link
Link选项卡控制着Visual C++的连接器,同样比较复杂。如图3-16所示,在General类别中,我们可以指定输出的文件名,以及一些在连接过程中需要使用的额外的库文件或目 标文件,下边5个选项的含义分别为:生成调试信息;忽略所有默认的库文件;允许递增连接方式(这种方式可以加快连接的速度);生成MAP文件;允许进行性 能分析。
图3-16 Link选项卡
Customize 类别中的一些选项与General类别有重复。选中Use program database允许使用程序数据库,这样连接器会把调试信息放在程序数据库中,如果不选中该选项,那么也不能使用递增连接方式。如果选中了Force file output,那么即使某个模块引用了一些未定义或者重复定义的符号,连接器仍然会生成一个有效(但不一定能正确运行)的可执行文件。在Debug类别 中,我们可以指定调试信息的类别是Microsoft的格式,还是COFF格式,或者两种都有,选中Separate types后连接器会把调试信息分开放在PDB文件中,这样连接起来会更快一些,但调试时速度却会慢一些。Input类别中是一些与输入库文件有关的选 项,我们可以在这里指定使用或不使用某些库文件或目标文件。Output类别中则是一些与最终输出的可执行文件有关的选项,包括:程序装载的基地址;程序 的入口地址;要为堆栈保留多少空间;程序的版本号。这些选项虽然是空着的,但它们都有自己的默认值,一般情况下都不用改变。
3.3.5 Resources
Resources 选项卡控制着Visual C++的资源编译器。如图3-17所示,我们可以指定编译后生成的资源文件的路径,资源的语言类型,以及额外的资源包含目录。
图3-17 Resources选项卡
3.3.6 MIDL
这个选项卡 与COM(组件对象模型)编程有关。如图3-18所示。
所有数据、方法、接口、类和库的特 性都由属性信息来描述。属性信息由括号括起来,作为它们描述的对象的前缀。
图3-18 MIDL选项卡
3.3.7 Browse Info
在Browse Info选项卡中,我们可以指定是否在建立工程的同时也生成浏览信息文件,有了这个文件后,我们就能够在文本编辑器中通过关联菜单的相应命令快速定位到某 个符号的定义或引用的地方。如图3-19所示。
图3-19 Browse Info选项卡
3.3.8 Custom Build
Custom Build选项卡允许我们为建立工程增加自己的步骤,其中在Commands中输入要执行的命令,在Outputs中输入该命令执行后得到的输出文 件,Visual C++将检查这个输出文件和源文件的时间先后关系,以便在需要的时候再次执行指定的命令,重新生成一次输出文件。如图3-20所示。
图3-20 Custom Build选项卡
3.3.9 Pre-link step
Pre-link step选项卡用于添加在连接之前要执行的命令。如图3-21所示。
图3-21 Pre-link step选项卡
3.3.10 Post-build step
Post-build step选项卡用于添加在工程建立完毕之后要执行的命令。如图3-22所示。