分享方式:


Visual Studio 專案中的屬性繼承

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

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

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

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

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

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

如先前所示,相同組態的相同屬性可能會在這些不同的檔案中指派不同的值。 當您建置專案時,MSBuild 引擎會以妥善定義的順序 (稍後所述) 評估專案檔與所有匯入的檔案。 評估每個檔案時,任何在該檔案中定義的屬性值都會覆寫現有值。 任何未指定的值則會從稍早所評估的檔案繼承。 當您使用屬性頁設定屬性時,請務必也要注意設定的位置。 如果在 .props 檔案中將屬性設定為 "X",但此屬性在專案檔中設定為 "Y",則專案將在屬性設定為 "Y" 的情況下建置。 如果相同屬性在專案項目 (例如 .cpp 檔案) 上設定為 "Z",則 MSBuild 引擎會使用 "Z" 值。

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

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

  2. 屬性工作表

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

  4. 項目中繼資料

提示

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

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

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

msbuild /pp:temp.txt myapp.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 會提供偵錯和發行組態。 每個設定都會對偵錯組建或發行組建適當地設定各種屬性。 您可以使用「組態管理員」來定義自訂組態。 這是將屬性針對特定組建進行分組的便利方式。

若要深入了解組建組態,請開啟「屬性管理員」。 您可以透過選擇 [檢視] > [屬性管理員][檢視] > [其他視窗] > [屬性管理員] 來開啟它,具體取決於您的設定。 「屬性管理員」包含專案中每個組態和平台配對的節點。 每個節點下都是屬性工作表 (.props 檔案) 的節點,可為該組態設定一些特定屬性。

[屬性管理員] 視窗的螢幕擷取畫面。

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

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

提示

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