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" 值。
以下是基本繼承樹狀結構:
MSBuild CPP 工具組的預設設定 (基底目錄中的
Microsoft.Cpp.Default.props
檔案,由.vcxproj
檔案匯入)。屬性工作表
.vcxproj
檔案。 (可以覆寫預設及屬性工作表設定)。項目中繼資料
提示
在屬性頁中,bold 的屬性在目前內容中定義的。 以一般字型表示的屬性是繼承的。
檢視展開的專案檔和所有匯入的值
有時候,檢視展開的檔案以判斷指定的屬性值如何繼承,十分有用。 若要檢視展開的版本,請在 Visual Studio 命令提示字元輸入下列命令 (將預留位置檔案名稱變更為您要使用的名稱)。
msbuild /pp:temp.txt myapp.vcxproj
除非您熟悉 MSBuild,不然展開的專案檔可能很龐大,而且難以了解。 以下是專案檔的基本結構:
基本專案屬性,不在 IDE 中顯示。
匯入
Microsoft.cpp.default.props
,這會定義一些與工具組無關的基本屬性。全域組態屬性 (在 [組態概觀] 頁面上公開為 PlatformToolset 和 Project 預設屬性)。 這些屬性會決定
Microsoft.cpp.props
在下一個步驟中匯入哪些工具組和內建屬性工作表。匯入
Microsoft.cpp.props
,這會設定大部分的專案預設值。匯入所有屬性工作表,包括
.user
檔案。 這些屬性工作表可能會覆寫除了 PlatformToolset 和 Project 預設屬性以外的所有屬性。其餘專案組態屬性。 這些值可以覆寫屬性工作表上已設定的屬性。
項目 (檔案) 以及其中繼資料。 這些項目永遠握有 MSBuild 評估規則的最後決定權,即使是在其他屬性和匯入之前出現。
如需詳細資訊,請參閱 MSBuild 屬性。
組建組態
組態只是已指定名稱的任意一組屬性。 Visual Studio 會提供偵錯和發行組態。 每個設定都會對偵錯組建或發行組建適當地設定各種屬性。 您可以使用「組態管理員」來定義自訂組態。 這是將屬性針對特定組建進行分組的便利方式。
若要深入了解組建組態,請開啟「屬性管理員」。 您可以透過選擇 [檢視] > [屬性管理員] 或 [檢視] > [其他視窗] > [屬性管理員] 來開啟它,具體取決於您的設定。 「屬性管理員」包含專案中每個組態和平台配對的節點。 每個節點下都是屬性工作表 (.props
檔案) 的節點,可為該組態設定一些特定屬性。
例如,您可以移至 [屬性] 頁中的 [一般] 窗格。 將 [字元集] 屬性變更為 [未設定],而不是 [使用 Unicode],然後按一下 [確定]。 屬性管理員現在不會顯示 Unicode 支援屬性工作表。 這在目前的組態中被移除了,但在其他組態中仍然存在。
如需有關屬性管理員和屬性工作表的詳細資訊,請參閱共用或重複使用 Visual StudioC++ 專案設定。
提示
.user
檔案是舊版功能。 建議您將其刪除,以根據組態和平台將屬性正確分組。