Visual Studio 專案中的屬性繼承

Visual Studio 原生專案系統是以 MSBuild 為基礎。 MSBuild 會定義任何種類的專案建置檔案格式和規則。 它會管理針對多個組態和平臺建置的大部分複雜度。 您會發現瞭解其運作方式很有用。 如果您想要定義自訂群組態,這特別重要。 或者,若要建立可重複使用的屬性集,您可以共用並匯入多個專案。

.vcxproj 檔案、.props 檔案和 .targets 檔案

專案屬性會儲存在數個檔案中。 有些會直接儲存在專案檔中 .vcxproj 。 其他則來自專案檔匯入的其他 .targets.props 檔案,以及提供預設值。 您會在基底目錄下的地區設定特定資料夾中找到 Visual Studio 2015 專案檔。 %ProgramFiles(x86)%\MSBuild\Microsoft.Cpp\v4.0\v140

專案屬性會儲存在數個檔案中。 有些會直接儲存在專案檔中 .vcxproj 。 其他則來自專案檔匯入的其他 .targets.props 檔案,以及提供預設值。 您會在基底目錄下的地區設定特定資料夾中找到 Visual Studio 2017 專案檔。 %VSINSTALLDIR%Common7\IDE\VC\VCTargets\

專案屬性會儲存在數個檔案中。 有些會直接儲存在專案檔中 .vcxproj 。 其他則來自專案檔匯入的其他 .targets.props 檔案,以及提供預設值。 您會在基底目錄 %VSINSTALLDIR%\MSBuild\Microsoft\VC\<version> 下的地區設定特定資料夾中找到 Visual Studio 專案檔。 <version>專屬於 Visual Studio 版本。 v160適用于 Visual Studio 2019。

屬性也會儲存在您可能會新增至您自己的專案的任何自訂 .props 檔案中。 強烈建議您 不要 手動編輯這些檔案。 請改用 IDE 中的屬性頁來修改所有屬性,特別是參與繼承的屬性,除非您對 MSBuild 和 .vcxproj 檔案有深入的瞭解。

如先前所示,相同組態的相同屬性可能會在這些不同的檔案中指派不同的值。 當您建置專案時,MSBuild 引擎會以定義完善的順序評估專案檔和所有匯入的檔案,以供稍後說明。 評估每個檔案時,任何在該檔案中定義的屬性值都會覆寫現有值。 未指定的任何值都會繼承自先前評估的檔案。 當您使用屬性頁設定屬性時,請務必注意設定它的位置。 如果您在檔案中 .props 將屬性設定為 「X」,但屬性在專案檔中設定為 「Y」,則專案會使用屬性設定為 「Y」 來建置。 如果專案專案上的相同屬性設定為 「Z」,例如 .cpp 檔案,則 MSBuild 引擎會使用 「Z」 值。

以下是基本繼承樹狀結構:

  1. MSBuild CPP 工具組的預設設定( Microsoft.Cpp.Default.props 檔案在基底目錄中由檔案匯入 .vcxproj

  2. 屬性工作表

  3. .vcxproj 檔。 (此檔案可以覆寫預設和屬性工作表設定。)

  4. 項目中繼資料

提示

在屬性頁面上,粗體 的屬性 定義于目前內容中。 以一般字型表示的屬性是繼承的。

檢視展開的專案檔和所有匯入的值

有時候,檢視展開的檔案以判斷指定的屬性值如何繼承,十分有用。 若要檢視展開的版本,請在 Visual Studio 命令提示字元輸入下列命令 (將預留位置檔案名稱變更為您要使用的名稱)。

msbuild /pp:temp.txtmyapp.vcxproj

除非您熟悉 MSBuild,否則展開的專案檔可能很大且難以理解。 以下是專案檔的基本結構:

  1. IDE 中未公開的基本專案屬性。

  2. 匯入 Microsoft.cpp.default.props ,其定義一些與工具組無關的基本屬性。

  3. 全域組態屬性 (在 [組態概觀] 頁面上公開為 PlatformToolsetProject 預設屬性)。 這些屬性會決定下一個步驟中 Microsoft.cpp.props 匯入哪些工具組和內建屬性工作表。

  4. Microsoft.cpp.props 入 ,這會設定大部分專案預設值。

  5. 匯入所有屬性工作表,包括 .user 檔案。 這些屬性工作表可能會覆寫除了 PlatformToolsetProject 預設屬性以外的所有屬性。

  6. 專案組態屬性的其餘部分。 這些值可以覆寫屬性工作表上已設定的屬性。

  7. 項目 (檔案) 以及其中繼資料。 這些專案一律是 MSBuild 評估規則中的最後一個字,即使它們發生在其他屬性和匯入之前也一樣。

如需詳細資訊,請參閱 MSBuild 屬性

組建組態

組態只是已指定名稱的任意一組屬性。 Visual Studio 提供偵錯和發行組態。 每個都會適當地設定偵錯組建或發行組建的各種屬性。 您可以使用 Configuration Manager 來定義自訂群組態。 它們是將屬性分組以取得特定組建類別的便利方式。

若要深入瞭解組建組態,請開啟 [屬性管理員 ]。 您可以視您的設定而定,選擇 [檢視 > 屬性管理員 ] 或 [檢視 > 其他 Windows > 屬性管理員 ] 來開啟它。 屬性管理員 具有專案中每個組態和平臺組的節點。 在這些節點下,每個節點都是屬性工作表 ( .props 檔案) 的節點,這些節點會設定該組態的某些特定屬性。

Screenshot of the Property Manager window.

例如,您可以移至 [屬性頁] 中的 [一般] 窗格。 將 [字元集] 屬性變更為 [未設定],而不是 [使用 Unicode],然後按一下 [ 確定 ]。 屬性管理員現在不會顯示 Unicode 支援 屬性工作表。 它已針對目前的組態移除,但仍有其他組態。

如需有關屬性管理員和屬性工作表的詳細資訊,請參閱共用或重複使用 Visual StudioC++ 專案設定

提示

檔案 .user 是舊版功能。 建議您將其刪除,以根據組態和平臺正確分組屬性。