乙個中等規模的解決方案通常都會包含多個專案,其中一些專案產出靜態庫,一些產出動態庫,一些用於單元測試,還有的產出最終的應用程式執行檔。除此以外,根據專案的需求,還會使用一些第三方的庫。
所以為解決方案設定乙個合理的目錄結構,不但可以使得**管理更井井有條,專案成員之間也更容易相互配合,更重要的是能夠使得最終應用程式的安裝包製作,源**打包發布和轉移變得十分容易。
解決方案與專案:
從vc6之後vc系列就使用解決方案(solution)來替代原來的工作空間,用於組織和管理多個相關的專案(project)。
文章首先演示乙個虛擬的解決方案和我們期望得到的目錄結構,然後使用vs的專案設定功能來一步一步達到我們的需求。
虛擬解決方案:
該虛擬解決方案名為gma,包含乙個動態鏈結庫專案chocolatemilk和乙個應用程式專案puremilk,需要使用乙個第三方庫log4cxx(apache log4j的c++移植版本,用於日誌輸出)。
log4cxx是以動態庫的方式編譯的,所以我們需要它的3樣東西,分別是標頭檔案,導入庫(log4cxx.lib, log4cxxd.lib)和動態鏈結庫(log4cxx.dll)。
假設我們期望的目錄結構如下圖:
1. gma是解決方案目錄
2. puremilk和chocolatemilk是專案目錄
3. lib目錄用於存放導入庫或者靜態庫(包括第三方庫和自己的專案)
4. include用於存放第三方庫的標頭檔案
5. bin目錄存放所有動態鏈結庫和執行檔,包括自己的產出和第三方庫,區分release和debug兩個版本。另外,程式執行過程中需要外部的資料檔案和啟動時需要的配置檔案等等都可放於該目錄
6. temp用於存放臨時生成檔案,其中compile存放編譯器編譯時生成的obj檔案,link存放鏈結器的輸出檔案。
上面目錄結構清晰,一面了然,當我們的程式需要製作安裝包或者要打包原始碼
發布的時候,它能夠使得我們生活變得更容易^_^
製作安裝包時我們只需將「\gma\bin\release\」目錄下的所有檔案打包。
發布和轉移原始碼的時候我們可以打包除了temp目錄以外「\gma\」下面的所有檔案和目錄(如果不需要執行檔,也可不包括bin)。
我們的需求是明確的,可是vs並不會自動為我們做好上面所有的事情。不過我們並不需要編寫複雜的編譯指令碼(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的部分;
$(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欄位:
vs可以讓我們設定構建前後執行的指令碼程式,所以為了完成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的部分;
$(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)\
這樣就大功告成了,現在你就可以編譯該執行程式並進行除錯。
VS2008 解決方案的目錄結構設定和管理
vc 2008 解決方案的目錄結構設定和管理 乙個中等規模的解決方案通常都會包含多個專案,其中一些專案產出靜態庫,一些產出動態庫,一些用於單元測試,還有的產出最終的應用程式執行檔。除此以外,根據專案的需求,還會使用一些第三方的庫。所以為解決方案設定乙個合理的目錄結構,不但可以使得 管理更井井有條,專...
關於VS中解決方案的檔案目錄型別
sourcefile資料夾裡面放的是cpp檔案這些,resourcefile資料夾是資源資料夾,裡面可以放你程式裡需要的資源,包括圖示,對話方塊,等等 對應的檔案如下 source files c,cpp header files h resource files ico,bmp,source fi...
VS2013 解決方案檔案結構分析
visual studio 的解決方案檔案是乙個文字檔案,其中的內容不是太複雜,有些時候 visual studio 會把這個檔案搞亂,理解一下這個檔案的結構,對我們處理一些異常情況有所幫助。表示注釋行 microsoft visual studio solution file 用來說明解決方案檔案...