使用專案屬性
在 IDE 中,所有的編譯器選項、連結器選項、偵錯工具設定和自訂建置步驟都會公開為「屬性」(Property)。您可以使用專案的「屬性頁」(Property Page) 檢視和修改其屬性。您可以將專案屬性獨立套用至組建組態 (Debug 或 Release) 與目標平台 (Win32、x64 或 ARM) 的任何組合。您也可以設定專案中個別檔案的屬性。
雖然可以按照每個使用者、每台電腦基準設定「全域」屬性,但是我們已不建議使用。相反地,建議您使用 [屬性管理員] 建立「屬性工作表」(Property Sheet) 以儲存您希望可以重複使用或與他人共用的每一種專案設定。屬性工作表也會減少不慎變更其他專案類型之屬性設定的可能性。本文稍後將詳細討論屬性工作表。
若要顯示 [屬性管理員],請在功能表列上,選擇 [檢視]、[其他視窗]、[屬性管理員]。
Visual C++ 專案系統是以 MSBuild 為基礎。雖然可以直接在命令列上編輯 XML 專案檔和屬性工作表,但是建議您使用 IDE,特別是當您修改參與繼承的屬性時。在 MSBuild 中有效的手動編輯檔案,Visual C++ 專案系統不一定都可讀取,而且您可能在建置流程中引入難以察覺的錯誤。
專案檔是副檔名為 .vcxproj 的 XML 檔案。您在 IDE 中設定的所有屬性都會直接寫入專案檔,或寫入在建置階段匯入的屬性工作表。
下圖顯示 Visual C++ 專案的屬性頁。請注意,在左窗格中已選取 [VC++ 目錄]「規則」(Rule),而在右窗格中會顯示與該規則相關聯的屬性 ($(...) 值為巨集,本文稍後將討論這部分)。[VC++ 目錄] 為組態屬性,其在不同組態 (例如,Debug 與 Release) 中的值可以不同。您可以使用對話方塊上方的 [組態] 和 [平台] 清單方塊,設定屬性套用至的組態。在許多情況下,[所有平台] 和 [所有組態] 會是正確的選擇。[一般屬性] 規則中的設定會套用至所有組態。
設定專案的屬性
一般而言,設定專案屬性的方式如下:
若要設定專案的屬性
在功能表列上,選擇 [專案]、[屬性]。或者,在 [方案總管] 或 [屬性管理員] 中開啟專案的捷徑功能表,然後選擇 [屬性]。[屬性頁] 對話方塊會開啟。
在對話方塊頂端的方塊中,選取您要將設定套用至的組態和平台。
若要建立或修改出現在 [組態] 方塊中的組態,請選擇 [組態管理員] 按鈕。
設定屬性值。當您選擇 [確定] 按鈕時,新值會寫入至專案檔。
注意事項 |
---|
[屬性頁] 對話方塊只會顯示適用於目前專案的屬性頁。例如,如果專案沒有 .idl 檔案,就不會顯示 MIDL 屬性頁。 |
有關 [屬性頁] 對話方塊中屬性的詳細資訊:
提示 |
---|
您可以在 [快速啟動] 視窗中輸入名稱,直接開啟屬性頁。 |
硬式編碼屬性與巨集的比較
有些專案屬性可以接受他處定義之屬性的參考做為值。這類型的值稱為「巨集」(Macro),有別於其他類型的專案屬性設定。巨集可以參考 MSBuild 系統所定義的屬性,或參考您自己定義的屬性。藉由使用巨集而不使用硬式編碼值 (例如目錄路徑),您可以更輕鬆地在電腦之間以及在 Visual Studio 版本之間共用屬性設定,並且更能確保您的專案設定正確參與屬性繼承。
全域巨集
套用至專案組態中的所有項目。具有語法 $(name)。例如,$(VCInstallDir) 即是全域巨集,這會儲存 Visual Studio 安裝根目錄。全域巨集對應於 MSBuild 中的 PropertyGroup。項目巨集
具有語法 %(name)。對於檔案,項目巨集只套用至該檔案。例如,您可以使用 %(AdditionalIncludeDirectories) 來指定只套用至特定檔案的 Include 目錄。這類型的項目巨集對應於 MSBuild 中的 ItemGroup 中繼資料。在專案組態的內容中使用時,項目巨集會套用至特定類型的所有檔案。例如,C/C++ [前置處理器定義] 組態屬性可以接受套用至專案中所有 .cpp 檔案的 %(PreprocessorDefinitions) 項目巨集。這類型的項目巨集對應於 MSBuild 中的 ItemDefinitionGroup 中繼資料。如需詳細資訊,請參閱項目定義。
您可以使用巨集來定義屬性值,而且可以使用屬性編輯器來檢視可用巨集的值。
屬性編輯器
您可以使用屬性編輯器,修改特定字串屬性和選擇巨集做為值。若要存取屬性編輯器,請選取屬性頁上的屬性,然後選擇右邊的向下箭號按鈕。如果下拉式清單包含 [<編輯>],則可以選擇來顯示該屬性的屬性編輯器。
在屬性編輯器中,您可以選擇 [巨集] 按鈕來檢視可用巨集及其目前值。下圖顯示選擇 [巨集] 按鈕之後,[其他 Include 目錄] 屬性的屬性編輯器。當 [從父代或專案預設值繼承] 核取方塊已選取,而且您加入新值時,這個值會附加至目前繼承的任何值。如果您清除此核取方塊,則新值會取代繼承的值。在大部分情況下,讓核取方塊保持已選取狀態。
共用可重複使用的屬性組態
如果您有一組要套用至多個專案的常用共同屬性,您可以使用 [屬性管理員],將這些屬性擷取到可重複使用的「屬性工作表」(Property Sheet) 檔案,其依慣例有 .props 副檔名。您可以將一個或多個工作表套用至新的專案,這樣就不需要從頭設定其屬性。若要存取 [屬性管理員],請在功能表列上,選擇 [檢視]、[屬性管理員]。
如果您選擇 [加入新的專案屬性工作表],然後選擇 (例如) MyProps.props 屬性工作表,就會出現屬性頁對話方塊。請注意,這會套用至 MyProps 屬性工作表。您所做的任何變更都將寫入至工作表,而非專案檔 (.vcxproj)。
如果直接在 .vcxproj 檔案中設定相同屬性,就會覆寫屬性工作表中的屬性。
您可以視需要匯入屬性工作表。方案中的多個專案可以繼承同一個屬性工作表中的設定,而且專案可以有多個工作表。屬性工作表本身可以繼承另一個屬性工作表中的設定。
重要事項 |
---|
由於 .props 檔案不是建立做為專案項目,因此預設不參與原始檔控制。如果要在原始檔控制中包含這個檔案,可以手動將其加入做為方案項目。 |
建立屬性工作表
在功能表列上,選擇 [檢視]、[屬性管理員]。[屬性管理員] 隨即開啟。
若要定義屬性工作表的範圍,請選取套用的項目。這可以是特定組態,或其他屬性工作表。開啟這個項目的捷徑功能表,然後選擇 [加入新的專案屬性工作表]。指定名稱和位置。
在 [屬性管理員] 中,開啟新的屬性工作表,然後設定您要包含的屬性。
屬性繼承
專案屬性是有層次的。每一層都會繼承上一層的值,但是繼承的值可以藉由明確設定屬性來覆寫。以下是基本繼承樹狀結構:
MSBuild CPP Toolset 的預設設定 (..\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.Cpp.Default.props,由 .vcxproj 檔案匯入)。
屬性工作表
.vcxproj 檔案 (可以覆寫預設及屬性工作表設定)。
項目中繼資料
提示 |
---|
在屬性頁中,以bold表示的屬性是在目前內容中定義的。以一般字型表示的屬性是繼承的。 |
專案檔 (.vcxproj) 會在建置階段匯入其他屬性工作表。匯入所有屬性工作表之後,將會對專案檔進行評估,任何屬性值的最後一個定義就是使用的值。有時候,檢視展開的檔案以判斷指定的屬性值如何繼承,十分有用。若要檢視展開的版本,請在 Visual Studio 命令提示字元輸入下列命令 (將預留位置檔案名稱變更為您要使用的名稱)。
msbuild /pp:temp.txtmyapp**.vcxproj**
除非您熟悉 MSBuild,不然展開的專案檔可能很龐大,而且難以了解。以下是專案檔的基本結構:
基本專案屬性,IDE 不會公開這些屬性。
匯入 Microsoft.cpp.default.props,這會定義一些與工具組無關的基本屬性。
全域組態屬性 (在 [組態概觀] 頁面上公開為 [PlatformToolset] 和 [Project] 預設屬性)。這些屬性會決定 Microsoft.cpp.props 在下一個步驟中匯入哪些工具組和內建屬性工作表。
匯入 Microsoft.cpp.props,這會設定大部分的專案預設值。
匯入所有屬性工作表,包括 .user 檔案。這些屬性工作表可能會覆寫除了 [PlatformToolset] 和 [Project] 預設屬性以外的所有屬性。
剩餘的專案組態屬性。這些值可以覆寫屬性工作表上已設定的屬性。
項目 (檔案) 以及其中繼資料。這些項目永遠握有 MSBuild 評估規則的最後決定權,即使是在其他屬性和匯入之前出現。
如需詳細資訊,請參閱 MSBuild 屬性。
.user 檔案,以及這些檔案會有問題的原因
Visual Studio 的過去版本會使用具有 .user 副檔名且位於 <userprofile>\AppData\Local\Microsoft\MSBuild\v4.0\ 資料夾的全域屬性工作表。我們已不建議使用,因為這些檔案是按照每位使用者、每台電腦基準來設定專案組態的屬性。這類「全域」設定可能干擾組建,尤其是在您以組建電腦上的多個平台為目標時。例如,如果您同時有 MFC 專案和 Windows Phone 專案,那麼 .user 屬性對其中一個專案會是無效的。可重複使用的屬性工作表具有較大彈性且更為穩固。
雖然 .user 檔案仍舊由 Visual Studio 安裝並且參與屬性繼承,但預設為空白。最佳做法是在 [屬性管理員] 中刪除其參考,以確保您的專案獨立運作,不受每個使用者、每台電腦設定的影響。這點對確保在 SCC (原始程式碼控制) 環境中產生正確行為非常重要。
將 Include 目錄加入至一組預設目錄
當您將 Include 目錄加入至專案時,注意不要覆寫所有的預設目錄。正確加入目錄的方式是附加新路徑 (例如 "C:\MyNewIncludeDir\"),然後將 $(IncludePath) 巨集附加至屬性值。
建立使用者定義巨集
您可以建立「使用者定義巨集」(User-defined Macro),在專案組置中當做變數使用。例如,您可以建立使用者定義巨集,提供自訂建置步驟或自訂建置工具的值。使用者定義巨集是名稱/值組。在專案檔中,可以使用 $(name) 標記法來存取值。
使用者定義巨集會儲存在屬性工作表中。如果您的專案沒有包含屬性工作表,請依照本文前面的步驟建立屬性工作表。
若要建立使用者定義巨集
在 [屬性管理員] 視窗 (在功能表列上,選擇 [檢視]、[屬性管理員]),開啟屬性工作表 (其名稱以 .user 結束) 的捷徑功能表,然後選擇 [屬性]。該屬性工作表的 [屬性頁] 對話方塊隨即開啟。
在對話方塊的左窗格中,選擇 [使用者巨集]。在右窗格中,選擇 [加入巨集] 按鈕以開啟 [加入使用者巨集] 對話方塊。
在對話方塊中,指定巨集的名稱和值。或者,選取 [設定此巨集做為建置環境中的環境變數] 核取方塊。
設定組建的環境變數
Visual C++ 編譯器 (cl.exe) 會辨識某些環境變數,特別是 LIB、LIBPATH、PATH 和 INCLUDE。當您使用 IDE 進行建置時,在 VC++ 目錄屬性頁屬性頁中設定的屬性會用來設定這些環境變數。如果已經設定 LIB、LIBPATH 和 INCLUDE 值 (例如,透過開發人員命令提示字元),這些值會取代為對應 MSBuild 屬性的值。組建接著會在 PATH 之前加上 [VC++ 目錄] 可執行檔目錄屬性的值。您可以設定使用者定義的環境變數,做法是建立使用者定義巨集,然後核取顯示 [設定此巨集做為建置環境中的環境變數] 的方塊。
設定偵錯工作階段的環境變數
在 [專案頁面] 對話方塊的左窗格中,展開 [組態屬性],然後選取 [偵錯]。
在右窗格中,修改 [環境] 或 [合併環境] 專案設定,然後選擇 [確定] 按鈕。
檢視所有巨集及其值
在專案的 [屬性頁] 對話方塊中,選取字串屬性 (例如 [VC++ 目錄]),選擇右欄中的向下箭號按鈕,然後選擇 [<編輯>] 以開啟屬性編輯器。在屬性編輯器中,選擇 [巨集] 按鈕。
同時設定多個組態的屬性
若要設定所有組態的屬性,在專案 [屬性頁] 對話方塊頂端的方塊中,選取 [所有組態] 和 [所有平台],然後設定您想要的屬性。
若只是要設定某些組態的屬性,在 [屬性管理員] 中複選屬性,然後開啟捷徑功能表並選擇 [屬性]。您變更的任何設定都會套用至您選取的每個組態。
您也可以為多個組態建立一個屬性工作表。若要這麼做,請建立每個組態的屬性工作表,開啟其中一個工作表的捷徑功能表,選擇 [加入現有屬性工作表],然後再加入其他工作表。不過,如果您使用一個通用屬性工作表,請注意當您設定屬性時,這個屬性是針對工作表所套用至的所有組態來設定;還要知道 IDE 不會告訴您哪些專案或其他屬性工作表是繼承自指定的屬性工作表。
在具有許多個專案的大型方案中,建立方案層級的屬性工作表會很有用。當您將專案加入至方案時,請使用 [屬性管理員] 將該屬性工作表加入至專案。如果這必須在專案層級進行,您可以加入新的屬性工作表來設定專案特定值。
若要快速瀏覽和搜尋所有選項
[所有選項] 屬性頁 (在 [屬性頁] 對話方塊左窗格中的 [C/C++] 節點底下) 提供快速的方式,讓您瀏覽和搜尋目前內容中可用的屬性。其中有特別的搜尋方塊和協助篩選結果的簡單語法:
沒有前置詞:
只在屬性名稱中搜尋 (不區分大小寫的子字串)。'/' 或 '-':
只在編譯器參數中搜尋 (不區分大小寫的前置詞)v:
只在值中搜尋 (不區分大小寫的子字串)。