在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都是別人幫你寫好了的)。