天天看點

掌握Visual Studio項目配置【基礎篇】

作者:Qt未來工程師

1. 前言

Visual Studio是Windows上最常用的C++內建開發環境之一,簡稱VS。

VS功能十分強大,對應的,其配置系統較為複雜。不管是對于初學者還是有一定開發經驗的開發者來說,捋清楚VS的配置系統的脈絡,不是一件容易的事情。

筆者在工作中發現,确實有開發者對VS的基礎配置項的作用模棱兩可。一方面原因是VS配置的相關資料比較零散,不容易快速完整地查找到;另一方面,網絡上找到的資料大多來自微軟官方,其内容多為英文或譯文,讀起來晦澀難懂。是以,對VS配置進行一番系統的專題研究并分享出來很有必要。

作為基礎篇,本文講解VS的基礎配置。

2. 熟悉項目配置界面

2.1 建立項目

我們以VS2015 Win32項目為例,講解C++項目配置。 建立項目時,選擇Win32項目,如下圖所示:

掌握Visual Studio項目配置【基礎篇】

建立Win32項目

2.2 打開項目屬性頁

建立項目完成後,在解決方案管理器中的項目名稱上右鍵,選擇屬性,如下所示:

掌握Visual Studio項目配置【基礎篇】

打開項目屬性

彈出的項目屬性頁對話框如下所示:

掌握Visual Studio項目配置【基礎篇】

項目屬性頁

項目屬性頁中各個序号所代表的區域分别為:

  • 區域1 :目前正在修改的配置名稱。Debug配置在開發調試階段使用,Release配置在軟體釋出時使用。“活動Debug”表示目前項目正在使用的配置是Debug配置。
  • 區域2 :目前正在修改的配置對應的目标平台名稱。Win32代表32位Windows系統,x64代表64位Windows系統。
  • 區域3 :配置項分類樹。
  • 區域4 :具體配置項。
  • 區域5 :具體配置項作用描述。

3. 難點分析

我們知道,內建開發環境出現的目的是,為開發者屏蔽底層編譯系統的瑣碎細節,讓軟體開發更加快捷友善。

那麼為什麼VS中還會有各種複雜的配置項?這些配置項大大增加了VS的使用難度。原因有兩點:

  • VS中的配置是需要使用者來完善的,內建開發環境無法将其完全屏蔽。
  • 不同的項目有不同的配置需求,這就要求內建開發環境必須給開發者提供配置接口。

綜上看來,VS的配置是我們無法繞過的,必須掌握。

VS的配置有一部分是比較難懂的,這是因為它和底層編譯系統息息相關。想要弄懂VS的配置,就必須了解VS的底層編譯系統。本來內建開發環境就是想把編譯系統的細節屏蔽掉,但實際上,我們還是要去學習其底層編譯系統。可見,僅僅浮于表面,很多問題是無法解決的,了解底層對我們解決難題來說至關重要。

4. 從軟體構造系統原理講起

為什麼要從軟體構造系統原理講起呢?因為VS是運作在軟體構造系統 MSBuild 之上的,軟體構造系統是讓項目配置真正生效的地方。

關于GUI和底層系統的關系,這裡多說幾句。在學習和研究軟體系統時,我們要抛棄使用GUI(圖形使用者界面)思考的方式。GUI僅僅是一個将軟體功能暴露給使用者的一種互動接口。當我們從開發者的角度去研究一個軟體系統時,我們的關注點和思考點不應該隻停留在軟體界面GUI上,而是應該将軟體界面從軟體中分離出去,深入研究位于GUI後面的、真正向外提供功能的底層系統原理。首先,同一個軟體系統可以有各種各樣的GUI設計,例如git有很多不同的圖形用戶端;再者,GUI隻是軟體系統将部分功能暴露出來的圖形接口,它是軟體系統完整功能的子集。是以說,GUI隻是一個表象,系統的核心和本質在底層系統。

我們大多數人習慣了使用Windows圖形界面的方式與系統互動,而不習慣linux指令行的方式與系統互動。從使用者的角度來說,圖形使用者界面确實比指令行更加友好。但是作為開發者,透過GUI看底層是我們的必修課。

回到正題。關于軟體構造系統,在上篇文章《掌握Qt構造系統》中有所描述。

軟體構造系統,簡單來說,就是一套完整的軟體構造工具和流程,可以将其看做是開發者的軟體生産工廠中的房間。它是一個典型的輸入輸出系統。

軟體構造系統的輸入是開發者提供的代碼資源,輸出是使用者可用的軟體産品。從代碼資源到軟體産品的加工過程,由構造系統中的工具和流程來完成。

圖示如下:

掌握Visual Studio項目配置【基礎篇】

軟體構造流程

開發者為了将代碼生成為可執行程式,必須至少為軟體構造系統提供以下資訊:

  • 項目基本資訊:項目名稱、項目類型、編譯工具、開發語言等資訊。一般在建立項目時配置。
  • 輸入資訊:構造系統的輸入是開發者提供的代碼資源。代碼資源就是指項目内的一切檔案,包括,頭檔案,源檔案,共享庫,資源檔案等等。為了能夠友善地對項目檔案進行管理和編輯,IDE一般都會提供圖形使用者界面,供開發者進行操作。例如VS中的項目資料總管用來管理項目和項目資源;代碼文本編輯器、資源編輯器被用來編輯具體的單個檔案。
  • 構造參數:軟體構造系統是靈活的,高度可配置的。開發者可以根據自己的需要,修改軟體系統中構造工具的執行參數,以控制軟體産品的生成過程。
  • 輸出資訊:輸出資訊主要包含軟體産品的名稱、版本、運作權限等配置。

配置好了以上資訊以後,軟體構造系統就能按照開發者的意圖生成軟體産品。

下面我們将結合軟體構造系統基本原理,詳細分析VS項目配置項的含義及配置方法。

5. 基本配置講解

5.1 正常屬性頁

掌握Visual Studio項目配置【基礎篇】

正常屬性編輯頁

其中比較重要的幾個配置項,解釋如下:

  • 目标平台:歸屬于輸出資訊配置。用于配置生成的軟體所運作的平台,一般為Windows。一般确定後即不可修改。
  • 目标平台版本:歸屬于輸出資訊配置。用于配置生成的軟體使用的win SDK版本。關于SDK版本和使用的平台,參考官方文檔:Windows SDK 和模拟器存檔,位址:https://developer.microsoft.com/zh-cn/windows/downloads/sdk-archive/
  • 輸出目錄:歸屬于輸出資訊配置。用于配置目标檔案的輸出目錄,在此示例項目中表示應用程式Win32Project1.exe所在目錄。 圖中此配置項的值是用兩個VS内置變量/宏合成的:$(SolutionDir)的值為目前解決方案檔案.sln檔案所在目錄,$(Configuration)的值為目前建構配置名稱(Debug/Release)。還有很多内置宏,可以在屬性值編輯對話框中查詢,此對話框打開方式如下圖:
掌握Visual Studio項目配置【基礎篇】

打開屬性值編輯對話框

打開後的值編輯對話框,如下圖所示:

掌握Visual Studio項目配置【基礎篇】

屬性值編輯對話框

下方列出的所有内置變量/宏均可以根據需要使用。

  • 中間目錄:歸屬于輸出資訊配置。用于配置建構過程中産生的中間檔案(如目标檔案,建構日志等)的存放位置。
  • 目标檔案名:歸屬于輸出資訊配置,用于配置目标檔案的檔案名,不包含檔案字尾名。
  • 目标檔案擴充名:歸屬于輸出資訊配置,用于配置目标檔案字尾名。
  • 平台工具集:歸屬于構造參數配置。用于選擇MSBuild建構系統的版本。參考:如何:修改目标架構和平台工具集。并不是隻要是exe應用程式就能在所有的Windows平台上都能運作。某些作業系統,例如xp系統,因為年代比較久遠,隻能使用特定的平台工具集來建構,才能在xp上正常運作。一般适用于生成xp系統應用程式的工具集名稱以"_xp"結尾。

5.2 調試屬性頁

掌握Visual Studio項目配置【基礎篇】

調試屬性編輯頁

調試器也可以認為是構造系統的一部分,它用于調試軟體産品,幫助解決軟體産品中存在的問題。

其中比較重要的配置項,解釋如下:

  • 指令:歸屬于構造參數配置。在點選調試按鈕時,VS會執行此啟動指令,啟動被調試的程式。對于生成應用程式的項目,此值預設為目标檔案路徑$(TargetPath),即直接啟動項目生成的應用程式。對于生成共享庫的項目,可以配置成調用此共享庫的應用程式的路徑。
  • 指令參數:歸屬于構造參數配置。在啟動被調試的程式時,VS會将此參數作為啟動參數傳遞給被調試的程式。指令+指令參數,這兩個配置項,共同指定了被調試程式的啟動資訊。
  • 工作目錄:歸屬于構造參數配置。用于指定被調試程式的工作目錄,預設為項目目錄$(ProjectDir),可以一般設定為exe所在目錄,即$(TargetDir)。程式啟動需要讀取目前目錄下的一些配置檔案,如果調試時發現檔案明明和應用程式在同一個目錄下,程式卻提示找不到,通常就是因為工作目錄沒有設定成應用程式所在目錄導緻的。
  • 附加:歸屬于構造參數配置。值為否,表示開始調試時,VS執行指令+指令參數啟動一個新的程序用于調試;值為是,表示開始調試時,如果由指令配置項指定的應用程式正在運作,則将調試器附加到已存在的程序進行調試。
  • 調試器類型:預設為自動,一般不需要修改。
  • 環境:歸屬于構造參數配置。為被調試的程式指定環境變量。
  • 合并環境:歸屬于構造參數配置。用于指定是否将上個配置項 環境配置 與目前VS的運作環境配置合并。

其他選項保持預設即可。關于調試器配置的官方文檔,參考: C++ 調試配置的項目設定。

5.3 C/C++配置

C/C++配置,主要用于配置編譯過程。

掌握Visual Studio項目配置【基礎篇】

C/C++配置編輯頁

其中,比較常用的配置有:

  • C/C++->正常->附加包含目錄:歸屬于輸入資訊配置。用于添加頭檔案的包含目錄。編譯代碼時,編譯器會到已添加的頭檔案包含目錄下查找頭檔案,引入相關定義。如果找不到頭檔案會出現未定義的錯誤。指定頭檔案包含目錄,可以簡化頭檔案包含語句,隻需要直接包含頭檔案名,即:#include "xxxxx.h",不需要指定頭檔案目錄,編譯器會自動查找。
  • C/C++->正常->多處理器編譯:歸屬于構造參數配置。值為是,編譯器會使用多個處理器核心并行編譯,可以加快編譯速度,但會增加CPU占用。值為否,編譯器不使用多個處理器核心并行編譯,編譯速度較慢。
  • C/C++->優化:歸屬于構造參數配置。用于指定編譯時的優化等級和優化方案。
  • C/C++->預處理器:歸屬于構造參數配置。用于預處理階段,定義和取消定義宏,進而生成不同的代碼。

5.4 連結器配置

連結器配置,主要用于配置程式連結過程。

掌握Visual Studio項目配置【基礎篇】

連結器配置編輯頁

其中,比較常用的配置有:

  • 連結器->正常->輸出檔案:歸屬于輸出資訊配置。用于指定輸出的目标檔案路徑,一般不做修改。
  • 連結器->正常->啟用增量連結:歸屬于構造參數配置。用于指定是否使用增量連結,加速程式連結過程。
  • 連結器->正常->附加庫目錄:歸屬于輸入資訊配置。用于指定連結庫目錄。指定庫目錄可以簡化依賴庫的指定方式,即隻需要指定依賴庫名稱即可,不需要指定路徑。執行連結步驟時,連結器會到已添加的庫目錄下根據庫名稱查找對應的連結庫,連結到程式中,最終生成目标檔案。
  • 連結器->輸入->附加依賴項:歸屬于輸入資訊配置。用于指定需要連結到目标檔案中的依賴庫名稱。
  • 連結器->調試:歸屬于輸出資訊配置。用于指定代碼優化等級、是否生成 .pdb 調試資訊資料庫檔案以用于調試等。

基本配置項主要包含了構造系統的基本輸入輸出配置。掌握以上配置項,基本可以勝任日常80%的開發任務。

紙上得來終覺淺,任何一個選項都需要自己親自配置、測試,才能真正掌握。

6. 結語

雖然VS的配置看起來比較繁雜,但如果從構造系統的角度總體把握,将抽象瑣碎的配置條目形象化,模型化,就可以化繁為簡,更易于我們了解和掌握。

在配置VS的時候,本質上就是在配置構造系統。不僅僅是VS,所有的內建開發環境,例如Qt Creator,都是如此。盡管不同的內建開發環境界面不同,但是本質原理都是相同的。

本文我們講解了VS的基礎配置,相對比較容易了解。在後面的文章中,我們會繼續講解關于VS配置更加深入的内容,敬請關注。

7. 參考

  • 設定編譯器和生成屬性(https://learn.microsoft.com/zh-cn/cpp/build/working-with-project-properties?view=msvc-170)
  • Visual Studio 中的 C/C++ 項目和生成系統(https://learn.microsoft.com/zh-cn/cpp/build/projects-and-build-systems-cpp?view=msvc-140)

本文原創釋出于“Qt未來工程師”。

繼續閱讀