在VS中,存在ATL、MFC、Win32、CLR、常规等等各种工程模板,这些工程模板对应于开发不同类型的应用,比如要开发com,你应该选ATL;开发最原始的通过API代用操作系统的应用,应该用Win32;开发MFC图形界面程序,应该用MFC等等,详细的可以去查资料,比如参考:ATL CLR MFC Win32 常规 的区别。
但是我们今天的重点不是这些选项代表什么意思,而是要选择不同模板建立工程之后,当你通过工程的属性面板去配置一些环境如外部保护路径、外部库等等时,不同类型的工程,他的“属性”面板是不一样的。比如你新建工程时选择的是<常规>里的<生成文件目录>的话,你是看不到如图一所示的熟悉的“VC++属性”、“链接器”等等熟悉的界面的,取而代之的是如图二这样的让你不知所以的界面。
图一 通常所见的工程的“属性”面板
图二 选择<常规>里的<生成文件目录>所生成项目的“属性”
何故?别急,这就要设计到一个很重要的文件了,VC的项目工程中,很重要的一个配置文件是一.vcxproj为扩展名的xml配置文件,文件的名字就是工程的名字。你所配置的“属性”就是记录在这个配置文件中的,当然,这个配置文件也包含了你看到的“属性”面板本身长什么样子。其中有一个很重要的配置为ConfigurationType,这就规定了你的是什么类型的项目。请看下面:
1 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> 2 <ConfigurationType>Application</ConfigurationType> 3 <UseDebugLibraries>true</UseDebugLibraries> 4 <CharacterSet>Unicode</CharacterSet> 5 </PropertyGroup> 6 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> 7 <ConfigurationType>Application</ConfigurationType> 8 <UseDebugLibraries>false</UseDebugLibraries> 9 <WholeProgramOptimization>true</WholeProgramOptimization> 10 <CharacterSet>Unicode</CharacterSet> 11 </PropertyGroup>
一般来说,我们都是要建立应用程序工程,所以我们看到的就是如图一所示的那种很熟悉的“属性”面板。要出现这样的面板,就需要在.vcxproj文件中配置如上面第2行和第7行的ConfiguratioinType为 Application。为什么要两个位置呢?因为这是对应于不同的编译方案,一个工程可以有多个编译方案,常见的就是Debug和Release,然后又分为Win32和x64(就是分别代表32位和64位,当然也有用x86和x64来代替的)。如果你生成项目时选择的是选择<常规>里的<生成文件目录>所生成项目的“属性”,那么.vcxproj配置文件里的Configuration就不是Application,而是Makefile,你就看到了如图二这样的“属性”面板了。
我们的图一和图二其实是同一个工程,然后我们通过手动更改.vcxproj文件的Configuration,实现了图一到图二的转化。至于为什么会存在这类非Application的工程呢?仔细看图二,有个NMake。这是什么呢?且继续往下看。
我们知道,很多开源库都是在Linux下面写的,因此不可能有VC的编译工程,而是Linux和Unix环境下常用的Makefile工程,而此时要在windows环境下编译,为了方便这类用户的需求,微软搞了一个叫nmake的东西,然后通过写一个类似于Makefile的文件(通常是makefile.vc),再加上一个nmake.opt的配置文件,实现对非VC工程的编译。这类工程照理说只能用命令行操作,但是微软的习惯就是能用鼠标就坚决不用键盘,并且认为用户都不懂命令行的,所以必须在VS这样的IDE中也搞出能够点一下鼠标就能实现Build、Clean这样的操作,所以有了Configuration是MakeFile这样的VC工程类型,让你继续只用鼠标不用键盘地工作。(其实也不是,比如你的makefile.vc就必须自己写,然而,除非你是大神,不然你用到的makefile.vc的时候都是为了用别人写好的库,此时makefile.vc都是别人帮你写好了的)。