1. 程式人生 > >VS專案屬性頁 Property page 與屬性管理器 Property manager 中配置關係

VS專案屬性頁 Property page 與屬性管理器 Property manager 中配置關係

在新建工程時,總是會有配置路徑、連結庫、生成目標等問題,這可以通過修改專案屬性配置來達到目的。

VS 中在一個專案上我們可以通過專案的屬性頁(Project Property page)來修改專案相關屬性,也可以通過修改屬性管理器(Property Manager)中的相關內容(Microsoft.Cpp.Win32.user Property page etc.)來修改專案相關屬性。本文意在說明他們之間的區別與聯絡。

專案檔案是副檔名為 .vcxproj 的 XML 檔案。 所有在 IDE 中設定的屬性直接寫入專案檔案或生成時匯入的屬性表中。

設定專案屬性
1. 在選單欄上,依次選擇“專案”、“屬性”。 或者在“解決方案資源管理器”或“屬性管理器”中,滑鼠在專案上右鍵(注意不是在專案名稱下面的 Debug 或 Release 資料夾上),然後選擇“屬性”。 此時將開啟專案的“屬性頁”對話方塊。
2. 在對話方塊頂部的框中,選擇要應用設定的配置和平臺。
若要建立或修改出現在“配置”框中的配置,請選擇“配置管理器”按鈕。
3. 設定屬性值。 選擇“確定”按鈕後,新值就會寫入專案檔案(.vcxproj)。

具體設定可以參考:

共享可重用的屬性配置

如果你經常需要建立某一類工程,在這一類工程中經常使用相同的“屬性集”,例如建立 OpenCV 類工程時需要將庫目錄加入到搜尋路徑,則可以使用“屬性管理器”(Property Manager)在可重用的屬性表文件中設定屬性,檔案的副檔名為 .props。

你可以將一張或多張屬性表應用於新專案,這樣就不必從零開始設定屬性。 若要訪問“屬性管理器”,在選單欄中選擇“檢視”、“屬性管理器”。

如果選擇“新增新專案屬性表”,然後進行選擇(例如 MyProps.props 屬性表),將顯示屬性頁對話方塊。 請注意,這個屬性頁對話方塊適用於 MyProps 屬性表,你所做的任何更改都將寫入表 (.props) 中,而非工程檔案 (.vcxproj) 中。


如果直接在 .vcxproj 檔案中設定同一屬性,屬性表中的屬性將被覆蓋。 
你可以工程需要匯入各種屬性表。 一個解決方案中的多個專案可從同一個屬性表繼承設定,一個專案可有多個表。 屬性表自身可以從另一個屬性表繼承設定。

需要注意的是:由於 .props 檔案不作為專案項建立,因此該檔案預設不參與原始碼管理(.vcxproj 是建立工程時預設就有的)。 如果你希望將檔案加入原始碼管理,則可以手動新增檔案作為解決方案項。

建立屬性表
1. 在選單欄上,依次選擇“檢視”、“屬性管理器”。 此時將開啟“屬性管理器”。
2. 若要定義屬性表的範圍,選擇屬性表適用的項(可以是 Debug、Release 或者整個專案,也可能是一個編譯器自帶的特殊配置,例如 Microsoft.Cpp.Win32.user,Application 等,或另一個之前倒入、建立的屬性表)。 開啟該項的右鍵選單,然後選擇“新增新專案屬性表”。 指定一個名稱和位置。
3. 在“屬性管理器”中,開啟新的屬性表然後設定要包括的屬性。
這裡面屬性表從結構上分層分級管理,建立屬性表需要照準需要應用的範圍。編譯器自帶的特殊配置檔案如 Microsoft.Cpp.Win32.user 位於 <userprofile>\AppData\Local\Microsoft\MSBuild\v4.0\ folder 中,是一個全域性的屬性表,是每次新建工程都會加入的。MSDN 中對這個檔案特別提到:

我們不再推薦這些檔案,因為它們是針對每個使用者、每臺計算機來設定專案配置屬性的。 特別是如果你在生成計算機上面向多個平臺,此類“全域性”設定會影響生成。 例如,如果你同時擁有一個 MFC 專案和 Windows Phone 專案,則其中一個專案的 .user 屬性將會無效。 可重用的屬性表更為靈活,而且更加可靠。
儘管 Visual Studio 仍安裝 .user 檔案並參與屬性繼承,但預設情況下,這些檔案為空。 最佳做法是刪除專案在“屬性管理器”中的引用,以確保專案按每個計算機設定和每個使用者獨立執行。這對確保在 SCC(原始碼管理)環境中的正確行為來說非常重要。

那麼可以這麼說:

1. 專案檔案是專案建立時就建立的,是副檔名為 .vcxproj 的 XML 檔案,作用域是本專案;

2. 屬性管理器中除了系統定義的在系統目錄下的配置檔案外可以自行新增屬性頁/表,副檔名是 .props 的 XML 檔案;

3. 自定義屬性表作用優先順序是較專案檔案 .vcxproj 低的,也就是說設定同一屬性,屬性表中的屬性將被覆蓋。

多重屬性之間的繼承關係:

專案屬性已分層。 每層繼承前一層的值,但是繼承的值可以通過設定屬性顯式重寫。 這是基本的繼承樹:
1. 來自 MSBuild CPP 工具集的預設設定(..\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.Cpp.Default.props,由 .vcxproj 檔案匯入。) 
2. 屬性表 
3. .vcxproj 檔案。(可能重寫預設設定和屬性頁設定。) 
4. 項元資料

在屬性頁中:在屬性頁中,黑體字顯示的屬性在當前上下文中定義。 普通字型的屬性將被繼承。

Visual C++ 專案系統基於 MSBuild雖然可以直接在命令列上編輯 XML 專案檔案和屬性表,我們仍建議你使用 IDE,在你修改參與繼承的屬性時,這一點尤為重要。Visual C++ 專案系統不一定可以識別在 MSBuild 中有效的手動編輯檔案,在生成過程中可能產生細微錯誤。

專案檔案是副檔名為 .vcxproj 的 XML 檔案。 所有在 IDE 中設定的屬性直接寫入專案檔案或生成時匯入的屬性表中。

在建立可重用的屬性配置時,通過新增使用者定義巨集可以很好的解決一些問題:

MSDN:

你可以建立使用者定義的巨集,以便在專案生成中將巨集用作變數。 例如,可以建立一個使用者定義的巨集來提供自定義生成步驟或自定義生成工具的值。 使用者定義的巨集是名稱/值對。 在專案檔案中,使用 $(name) 表示法訪問該值。
使用者定義的巨集儲存在屬性表中。 如果你的專案尚未包含屬性表,請按照中的步驟建立一個屬性表。
建立使用者定義的巨集
1. 在“屬性管理器”視窗中(在選單欄上,依次選擇“檢視”、“屬性管理器”),開啟屬性表的快捷選單(名稱以 .user 結尾),然後選擇“屬性”。 此時將開啟該屬性表的“屬性頁”對話方塊。
2. 在對話方塊的左窗格中,選擇“使用者巨集”。 在右窗格中,選擇“新增巨集”按鈕,開啟“新增使用者巨集”對話方塊。
3. 在對話方塊中,指定巨集的名稱和值。 (可選)選中“將此巨集設定為生成環境中的環境變數”複選框。

這樣就可以避免去定義系統變數,避免為了某類工程而去修改系統設定。

相關參考: