VS 2008 解決方案的目錄結構設定和管理 [整理]

查志強發表於2016-09-13

【原文:http://blog.csdn.net/puttytree/article/details/7838419

在介紹專案配置之前,先說明兩點

1.

         專案配置中,最好不要使用相對路徑,更不要使用絕對路徑

         應儘量使用巨集來指定所有路徑

 

         請在以下地方檢視VS2008中與路徑相關的巨集

         a.C/C++->常規->附加包含目錄

         b.點選右邊的按鈕,會彈出一個對話方塊

         c.點選右下角的巨集按鈕,就可以看到所有的巨集

 

2.

         在進行專案設定的時候,如果Debug和release下具有相同的屬性,那麼,在屬性頁中,最好配置選項設定為:所有配置

         這樣,可以同時修改Debug和Release部分。

 

我們的專案的目錄結構如下:

 

 

為了實現這樣的目錄結構,在建立工程專案的時候需要進行如下配置:

其中前三項是必須修改的指定的設定,後面使用者可選

 

1.配置專案的輸出目錄和中間目錄

         配置屬性->常規->輸出目錄:

         $(SolutionDir)Build\Link\$(ProjectName)\$(ConfigurationName)

         配置屬性->常規->中間目錄:

         $(SolutionDir)Build\Compile\$(ProjectName)\$(ConfigurationName)

 

2.配置輸出檔案所在目錄

         連結->常規->輸出檔案:

         $(OutDir)\$(ProjectName).dll

         連結->常規->附加庫目錄:

         $(SolutionDir)lib\$(ConfigurationName)

         其它專案如VBCSwitcher,如果也要引用當前lib中的庫,則附加庫目錄為:

         $(SolutionDir)..\ebase\Lib\$(ConfigurationName)

 

3.配置生成後事件,將輸出目錄中的最終輸出檔案拷貝到bin目錄中,同時將輸出的lib檔案拷貝到lib目錄中

         生成事件->生成後事件->命令列:

         copy $(TargetPath) $(SolutionDir)Bin\$(ConfigurationName)

         copy $(TargetDir)$(TargetName).lib $(SolutionDir)Lib\$(ConfigurationName)

        

         其它專案如VBCSwitcher,如果也要輸出到此目錄,則生成後事件可寫為:

         copy $(TargetPath) $(SolutionDir)..\ebase\Bin\$(ConfigurationName)

         copy $(TargetDir)$(TargetName).lib $(SolutionDir)..\ebase\Lib\$(ConfigurationName)

 

 

         如果有需要註冊的控制元件也可以在生成後事件中完全註冊

         echo regsvr32 $(TargetFileName) >> $(SolutionDir)Bin\$(ConfigurationName)\register.bat

         echo regsvr32 /u $(TargetFileName) >> $(SolutionDir)Bin\$(ConfigurationName)\unregister.bat

 

4.如果要指定除錯命令和工作目錄,則在下面的地方設定

         除錯->命令:

$(SolutionDir)\Bin\$(ConfigurationName)\$(TargetFileName)

除錯->工作目錄:

$(SolutionDir)\Bin\$(ConfigurationName)\

具體檢視如下部分說明:
以下部分的說明摘抄自:
http://blog.csdn.net/rogeryi/archive/2007/01/13/1481923.aspx

VC 2005 解決方案的目錄結構設定和管理
 
一箇中等規模的解決方案通常都會包含多個專案,其中一些專案產出靜態庫,一些產出動態庫,一些用於單元測試,還有的產出最終的應用程式執行檔。除此以外,根據專案的需求,還會使用一些第三方的庫。
 
所以為解決方案設定一個合理的目錄結構,不但可以使得程式碼管理更井井有條,專案成員之間也更容易相互配合,更重要的是能夠使得最終應用程式的安裝包製作,原始碼打包釋出和轉移變得十分容易。
 
解決方案與專案:
VC6之後VC系列就使用解決方案(Solution)來替代原來的工作空間,用於組織和管理多個相關的專案(Project)。
 
文章首先演示一個虛擬的解決方案和我們期望得到的目錄結構,然後使用VC2005的專案設定功能來一步一步達到我們的需求。
 
 
虛擬解決方案:
 
該虛擬解決方案名為GMA,包含一個動態連結庫專案ChocolateMilk和一個應用程式專案PureMilk,需要使用一個第三方庫log4cxx(Apache log4j的C++移植版本,用於日誌輸出)。
 
log4cxx是以動態庫的方式編譯的,所以我們需要它的3樣東西,分別是標頭檔案,匯入庫(log4cxx.lib, log4cxxd.lib)和動態連結庫(log4cxx.dll)。
 
假設我們期望的目錄結構如下圖:
 
 
1. GMA是解決方案目錄
2. PureMilk和ChocolateMilk是專案目錄
3. Lib目錄用於存放匯入庫或者靜態庫(包括第三方庫和自己的專案)
4. Incl?用於存放第三方庫的標頭檔案
5. Bin目錄存放所有動態連結庫和執行檔,包括自己的產出和第三方庫,區分Release和Debug兩個版本。另外,程式執行過程中需要外部的資料檔案和啟動時需要的配置檔案等等都可放於該目錄
6. Temp用於存放臨時生成檔案,其中Compile存放編譯器編譯時生成的obj檔案,Link存放連結器的輸出檔案。
 
上面目錄結構清晰,一面瞭然,當我們的程式需要製作安裝包或者要打包原始碼
釋出的時候,它能夠使得我們生活變得更容易^_^
 
製作安裝包時我們只需將“/GMA/Bin/Release/”目錄下的所有檔案打包。
 
釋出和轉移原始碼的時候我們可以打包除了Temp目錄以外“/GMA/”下面的所有檔案和目錄(如果不需要執行檔,也可不包括Bin)。
 
我們的需求是明確的,可是VC 2005並不會自動為我們做好上面所有的事情。不過我們並不需要編寫複雜的編譯指令碼(makefile),只需要簡單的修改專案的預設設定即可。
 
我們需要VC為我們做的事情包括:
 
1.使用“/GMA/Temp/Compile/”作為專案編譯時使用的中間目錄
2.使用“/GMA/Temp/Link/”作為專案連結的輸出目錄
3.當專案是應用程式時,在構建結束後拷貝執行檔案到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”,當專案是動態連結庫時,除了拷貝dll到Bin,還拷貝匯入庫到“/GMA/Lib/”
4.當專案是應用程式時,除錯時執行“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”下面的執行檔案,並以“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”為工作目錄
 
首先看一下專案設定中可以使用的巨集,常用的有:
 

ConfigurationName 配置名字,通常是Debug或者Release
IntDir 編譯器使用的中間目錄,產出obj檔案
OutDir 連結器使用的輸出目錄
ProjectDir 專案目錄
ProjectName 專案名字
SolutionDir 解決方案目錄
TargetDir 目標輸出檔案所在的目錄
TargetExt 目標輸出的副檔名
TargetFileName 目標輸出檔名,包括副檔名
TargetName 目標輸出名,不包括副檔名
TargetPath 目標輸出檔案的全路徑名

 
 
首先來設定ChocolateMilk
 
1.使用“/GMA/Temp/Compile/”作為專案編譯時使用的中間目錄
2.使用“/GMA/Temp/Link/”作為專案連結的輸出目錄
 
 
 
注意高亮的部分,首先將配置改成All Configuration(全部配置),這樣可以讓我們同時修改Debug和Release的部分;
 
Output Directory(輸出目錄,連結器)欄位填入:
$(SolutionDir)\Temp\Link\$(ProjectName)\$(ConfigurationName)
 
Intermediate Directory(中間目錄,編譯器)欄位填入:
$(SolutionDir)\Temp\Compile\$(ProjectName)\$(ConfigurationName)
 
3.構建結束後拷貝動態連結庫到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”,拷貝匯入庫到“/GMA/Lib/”
 
我們通常都會在Debug版本的輸出庫後面加上字母“d”以表示這是Debug版本,在Debug配置下,修改Import Library欄位:
 
 
 
VC可以讓我們設定構建前後執行的指令碼程式,所以為了完成3,
我們需要寫構建後執行的指令碼:
 
 
在Command Line中填入,Debug配置下:
 
copy $(TargetPath) $(SolutionDir)\Bin\$(ConfigurationName)\;
copy $(TargetDir)$(TargetName)d.lib $(SolutionDir)\Lib\;
 
Release配置下:
 
copy $(TargetPath) $(SolutionDir)\Bin\$(ConfigurationName)\;
copy $(TargetDir)$(TargetName).lib $(SolutionDir)\Lib\;
 
之所以要分別設定是因為VC沒有表示匯入庫的巨集名字 -_-P
 
OK,到此為止,你就可以編譯ChocolateMilk專案試試是不是一切正常了,不過請確認拷貝的目標目錄事先建立好。
 
接下來我們設定應用程式專案PureMilk
 
1.使用“/GMA/Temp/Compile/”作為專案編譯時使用的中間目錄
2.使用“/GMA/Temp/Link/”作為專案連結的輸出目錄
 
首先將配置改成All Configuration(全部配置),這樣可以讓我們同時修改Debug和Release的部分;
 
Output Directory(輸出目錄,連結器)欄位填入:
$(SolutionDir)\Temp\Link\$(ProjectName)\$(ConfigurationName)
 
Intermediate Directory(中間目錄,編譯器)欄位填入:
$(SolutionDir)\Temp\Compile\$(ProjectName)\$(ConfigurationName)
 
3.構建結束後拷貝執行檔案到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”
 
在Command Line中填入,All配置下:
 
copy $(TargetPath) $(SolutionDir)\Bin\$(ConfigurationName);
 
4.除錯時執行“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”下面的執行檔案,並以“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”為工作目錄
Command欄位填入:$(SolutionDir)\Bin\$(ConfigurationName)\$(TargetFileName)
Working Directory欄位填入:$(SolutionDir)\Bin\$(ConfigurationName)\
 
這樣就大功告成了,現在你就可以編譯該執行程式並進行除錯。

相關文章