上一篇文章[帶你玩轉Visual Studio——帶你管理多種釋出版本](http://blog.csdn.net/luoweifu/article/details/48912241)讓我們了解了Debug與Release的區別,并學會也如果管理 多個不同釋出版本的配制項。在一個大型的項目中,往往不止一個工程,而會有多個工程相互關聯,每個工程也都會有自己的釋出版本,這就是這篇文章將要講述的內容。
# 一個Solution多個Project
## 多個工程簡介
在[帶你玩轉Visual Studio——帶你新建一個工程](http://blog.csdn.net/luoweifu/article/details/48692267)一文中提到一個Solution(解決方案)可以有多個Project(工程),那什么時候需要有多工程呢? 多工程又有什么好處呢?
**應用場景:**當一個項目由多個不同的組件(模塊)構成時,為每一個組件創建一個工程,所有的組件工程在同一個解決方案下。?
**優點:**結構清晰,可進行分模塊開發,對復雜程序進行解耦。
## 創建一個多工程項目
我們還是以Utils這個工程為例,在[帶你發布自己的工程庫](http://blog.csdn.net/luoweifu/article/details/48895765)一文及上一篇[帶你管理多種釋出版本](http://blog.csdn.net/luoweifu/article/details/48912241)中已經創建了一個Utils工程,并為它編譯出了多個版本的庫,但我們使用這個庫的時候卻是在另一個Solution下進行的,其實我們完全可以而且也應該把使用Utils庫的工程與Utils工程放在一個解決方案下。
1. **新建Project添加到已有Solution中**,File->New->Project… 打開新建工程對話框新建一個UsingUtils工程,注意在Solution這一欄中我們選擇Add to solution。?
?
添加一個工程
2. **添加引用關聯**,這時我們要使用這個Utils編譯出來的庫,配制也要簡單一點了。右鍵UsingUtils工程->Properties->Common Properties->Framework and references,添加引用(依賴)的工程Utils。設置引用關聯后,如果Utils工程發生改動或更新,在編譯UsingUtils工程時就會重新編譯Utils工程。?

添加引用關聯
3. **設置頭文件的路徑**。?

設置頭文件的路徑
4. **設置啟動工程**,在有多個工程的Solution中要設置啟動工程(也就是要第一個開始執行的工程),不然你按F5運行時不知道從哪個工程開始執行。選擇UsingUtils工程名右鍵鼠標->Set as Startup Project。然后就可以執行或調試UsingUtils工程了。
# 編譯結果和目錄管理
在多個組件同時開發時,把相關的Project放在同一個Solution下會方便很多。但你有沒有發現一個新的問題,如果一個Solution有很多的Project,每一個Project目錄下都會有一個編譯結果的目錄,如下圖這樣你昏不昏??
?
編譯結果目錄
那如何管理這些目錄,使這些目錄看起來不這么混亂呢?其實我們是可以設置這些目錄的輸出路徑的,可以把它們放在一起管理。我們可以將輸出目錄設計成這樣:
* Utils?
* Utils
* UsingUtils
* Output?
* Win32?
* Debug?
* Bin
* Lib
* Temp
* Release?
* Bin
* Lib
* Temp
* Linux?
* Debug?
* Bin
* Lib
* Temp
* Release?
* Bin
* Lib
* Temp
這樣看起來是不是結構清晰多了!Output為輸出目錄,Win32為Windows X32下編譯的結構,Linux為Linux平臺下的編譯結果(這個涉及到跨平臺開發,暫時不談),Win32下再有Debug和Release等多個不同的釋出版本,Bin下放置編譯出的最終結果(如.exe等),Lib下放置編譯出的所有.lib文件,Temp放置編譯過程的臨時文件(如.obj等)。
我們還是以Utils為例進行說明。Utils Solution下有兩個Project:Utils(編譯出Utils工具庫)和UsingUtils(使用Utils的庫),僅以釋出Debug_Static進行說明,其它的釋出方式與此類似。
1. **所有Project使用同一組配制項。**?
什么意思呢?我們在[帶你玩轉Visual Studio——帶你管理多種釋出版本](http://blog.csdn.net/luoweifu/article/details/48912241)一文說到Debug和Release就是一組配制項,其實整個Solution有一個配制項,每一個Project也有自己的配制項。?
整個Solution的配制項也就是下圖工具欄中你能看到的這些配制項:?
?
Solution的配制項
而每一個Project的配制薦是你右鍵工程名->Properties能看到的配制項:?

Project的配制項
一般一個Solution下的所有的Project最好使用同組配制項,這樣不容易混亂。
2. **給UsingUtils添加Debug_Static配制項。**我們設置Utils的屬性時已經配制了Debug_Static的配制項,并設置了Solution的Debug_Static配制項,再給UsingUtils添加Debug_Static的配制項。?

添加配制項
標“4”的Create new solution configurations表示為整個Solution也添加(Debug_Static)配制項,這個復選框得取消勾選,因為設置Utils時已經為Solution默認添加了Debug_Static配制項,不然會添加不上。
3. **設置Utils的輸出路徑**,右鍵Utils工程->Properties進行如下配制。?

設置輸出路徑
4. **拷貝導出庫.lib**,我們可以將Utils編譯出的靜態庫拷貝Utils.lib到Lib目錄下,這樣我們就可以直接把這個文件提供到調用方使用。?

Build Events中可以設置編譯前、鏈接前、編譯后要進行的處理事件。這里我們目地是編譯后將編譯出的Utils.lib拷貝到Lib文件夾下,所以我們在Post-Build Event輸入以下命令
~~~
:如果Lib目錄不存在,側創建這個目錄
if not exist $(SolutionDir)Output\Win32\$(Configuration)\Lib md $(SolutionDir)Output\Win32\$(Configuration)\Lib
:將(ProjectName).lib文件拷貝到Lib目錄下
copy /y $(SolutionDir)Output\Win32\$(Configuration)\Bin\$(ProjectName).lib $(SolutionDir)Output\Win32\$(Configuration)\Lib\
~~~
1. **設置UsingUtils的輸出路徑**,與Utils類似如下:?

設置UsingUtils的輸出路徑
2. **設置完成**,Ok,編譯一下再來看看輸出結果目錄,是不是清晰多了!?
?
新的輸出結果目錄
上一篇回顧:?
[帶你玩轉Visual Studio——帶你管理多種釋出版本](http://blog.csdn.net/luoweifu/article/details/48912241)
下一篇要講述的內容:?
帶你玩轉Visual Studio——帶你理解微軟的預編譯頭技術