標籤:window 內容 建立 組織 自己的 for 引用 註冊 appdata
在 VS2010 中,C++ 的工程檔案已經和 2005 / 2008 有了很大的不同,而是完全採用 MSBUILD 的屬性方式進行表達,並且可以讓使用者通過一次性的配置而對所有的屬性進行自訂;
根據我的理解和實際使用中發現的一些資訊,現整理成文與大家分享:
一、工程檔案分為三個主要部分:初始化配置資訊、預設配置資訊和本地配置資訊;
二、配置資訊全部採用屬性檔案的方式進行組織,並且可以通過“匯入”進行引用;
三、屬性檔案中可以包含工程屬性、編譯屬性和連結屬性的配置;
四、所有的配置項可以通過使用過濾條件來決定配置是否生效;
五、通過內建的運算式可以訪問註冊表或者調用.NET函數;
首先來說工程檔案的組成
1、工程檔案的起始部分是 ProjectConfigurations , 裡麵包含 Configuration(Debug 或者 Release)和 Platform(Win32、x64等),這個部分配置了工程編譯目標的個數,預設配置只有兩個:Win32 平台下的 Debug 和 Release;
2、其後是一切全域屬性的配置,關鍵是 Keyword 屬性,該屬性決定了很多後續的預設屬性檔案的匯入行為,例如是否匯入 MFC 的預設屬性設定;
3、匯入 C++預設屬性檔案 Microsoft.Cpp.Default.props , 該檔案在 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0 目錄下( Windows 64 上的預設安裝位置,在你的機器上可能會有所不同,可以通過註冊表 HKEY_LOCAL_MACHINE\Software\Microsoft\MSBuild\ToolsVersions\4.0 中的屬性 VCTargetsPath 找到位置);
4、根據編譯的配置不同進行一些本工程的特定配置,例如“ConfigurationType”、“CharacterSet”和"WholeProgramOptimization"
5、匯入C++的屬性檔案 Microsoft.Cpp.props , 和預設屬性檔案 Microsoft.Cpp.Default.props 在相同的位置
6、根據編譯的配置不同匯入不同的使用者配置屬性檔案,主要是根據平台的不同進行屬性檔案的匯入,路徑為 %LOCALAPPDATA%\Microsoft\MSBuild\v4.0\,這些檔案沒有配置任何的內容,如果你刪除它們,那麼在開啟 C++ 工程檔案時,IDE 會自動的建立它們;請注意關鍵就在這裡,這些檔案的目的就是為了使用者可以對C++工程的屬性進行自訂,並且是“使用者”層級的,也就是說在這些檔案中增加的屬性將對你所有的工程起作用;
7、根據編譯的配置不同對“編譯”、“串連”、“庫”等選項進行工程的本地配置,例如:“警告層級”、“最佳化選項”和“宏”的定義等;
8、工程中包含的檔案,例如 ClCompile 包含的是需要進行 C/C++ 編譯的檔案,ResourceCompile 包含的是需要 RC 進行編譯的資源檔,等等;
9、匯入C++的編譯目標屬性定義檔案“Microsoft.Cpp.targets”,和預設屬性檔案的位置相同;
好了,到此為止,工程檔案的9個組成部分已經大致的分析出來了,如果對 Microsoft.Cpp.Default.props 、Microsoft.Cpp.props 和 Microsoft.Cpp.targets 進行簡單分析就會發現,它們都是首先根據編譯的目標平台匯入對應的平台定義的檔案,然後是自己的屬性定義,並且這些屬性都會在沒有定義的情況下才會生效,避免衝掉前面的定義;並且還可以發現一個秘密,那就是在編譯系統還為每一個工程提供了一個免費的屬性定會以檔案,*.vcxproj.user ,這個檔案如果存在,那麼將會被自動匯入;
通過以上分析,我們可以發現C++的編譯系統其實除了工程檔案本身之外(畢竟不可能把所有的編譯選項都放到工程檔案中)還另外提供來三個層級的屬性設定檔:
1、工程層級的,就是 *.vcxproj.user 檔案;
2、使用者層級的,就是 Microsoft.Cpp.$(Platform).user.props 檔案
3、系統層級的,就是 前面提供到 Microsoft.Cpp.Default.props 、Microsoft.Cpp.props 和 Microsoft.Cpp.targets 檔案;
Visual Studio 2010 C++ 工程檔案解讀