http://blog.csdn.net/lcj_cjfykx/article/details/8632459
MS的這個IDE,實在龐雜得恐怖。從大學開始,我就一直用VC的各個版本寫程序至今,細細想來,也僅僅是窺豹一斑,羞愧不已。但若仔細翻閱文檔,又覺得時間花得不值,於是便一直湊活地用着。
前段時間負責搭建新項目的開發環境,兼一直在看Gamebryo的代碼,從中借鑒了不少工程管理的方法。結合以前使用VC的經驗,現總結下來與大家分享,希望能起到拋磚引玉的作用。
項目目錄結構
VC用解決方案(solution)來表示項目,每個項目由一個或多個工程(project)組成,每個project用來管理一個相對獨立的模塊。有些大型的項目,例如Gamebryo,甚至會有多個solution:一個solution用來管理LIB或DLL;一個solution用來管理所有的DEMO;一個solution用來管理tools等等。拆分成多個工程,好處之一是結構清晰,二是方便並行開發。每個project由不同的程序員維護,輸出LIB或DLL,再鏈接生成最終的EXE。項目的拆分是很有技術含量的,可以看出設計的功力。拆分得不好,就會產生一些諸如”project間相互依賴”的負面效應。
建立項目的時候,第一件要考慮的事情就是如何配置文件目錄結構。如果是只有幾個obj的微型項目,將所有東西全部扔到一個目錄下也未嘗不可(當然,這依然是最糟糕的做法);而對於包含N個project,一大堆的源代碼,還有文檔,資源等等的大項目,糟糕的文件管理會把事情弄成一團漿糊。優秀的目錄配置可以幫助開發者迅速找到需要的東西,很容易就可以添加新的模塊和代碼,甚至反映出項目的基礎架構…最后,好的目錄結構,是充滿美感的:)
下面就是本人比較喜歡的目錄結構設置,實際中根據項目大小和需求有所增減:
src:存放所有的源代碼
build:存放所有的工程文件(solution,project,makefile等)
doc:項目文檔,doxygen文件等
sdk:工程依賴的所有庫文件和頭文件
out:編譯器產生的中間文件,目標文件
bin:編譯得到的exe和dll
上圖沒有列出來,但通常還會有:
res:資源目錄,可執行文件需要用到的各種圖像,聲音,模型,場景,UI等資源文件
script:存放腳本文件
tool:各種自動化工具
稍微說明一下:一是最重要的源碼要單獨放一個目錄,且不同模塊的代碼都歸置到不同的子目錄下。這樣的好處是,別人只需要看一眼你的目錄結構,就大概知道你工程是怎樣的一個架構了。我討厭所有header放一個目錄,所有cpp放另一個目錄的做法,想找個文件都很痛苦。
二是工程文件(vc solution,project,makefile等)單獨放一個目錄。工程文件的重要程度僅次於源碼,無工程文件,別人要編譯或瀏覽你的代碼都很杯具。插一句,有VC Project的話,Windows下用VC看代碼真的是不二之選(當然,Linux下的工具集自不必提),再次就是Editplus+Everything了。話說回來,專業一點的話,build下應該有兩個子目錄:MSVC和MakeFile,當然還可以有CodeBlock,CodeLite等等。VC工程的話,solution,project和property sheet也應該分開存放
然后就是靜態庫。每個項目都應該是自給自足的,即整個項目目錄我隨便copy到什么地方,都照樣能編譯運行。所以必須要包含所有項目依賴的第三方的庫文件和相關的頭文件。還有我們的project本身也可能會輸出lib,也應該放在同樣的目錄下,這樣方便設置搜索路徑。
最后就是編譯過程中產生的中間文件,這些我全部扔到out目錄里,按"“project_name /[debug | release | shipping] /”分目錄存放,一是清理方便,二是看着舒心,最近我還發現這樣還能避免鏈接靜態庫時的PCH Replacing的問題。而exe和DLL我輸出到bin下,Lib則輸出到SDK,debug版帶后綴_d,release版帶后綴_r,類似地shipping版帶后綴_s
接下來會具體聊一下project屬性的設置…
解決方案與項目:
ConfigurationName
|
配置名字,通常是Debug或者Release
|
IntDir
|
編譯器使用的中間目錄,產出obj文件
|
OutDir
|
鏈接器使用的輸出目錄
|
ProjectDir
|
項目目錄
|
ProjectName
|
項目名字
|
SolutionDir
|
解決方案目錄
|
TargetDir
|
目標輸出文件所在的目錄
|
TargetExt
|
目標輸出的擴展名
|
TargetFileName
|
目標輸出文件名,包括擴展名
|
TargetName
|
目標輸出名,不包括擴展名
|
TargetPath
|
目標輸出文件的全路徑名
|





Visual C++ 使用解決方案來管理項目,項目之間還可能有依賴關系,設置適合自己的解決方案目錄結構,便於代碼的管理、程序的發布。
下面開始一個虛擬解決方案設計:
假設此解決方案有應用程序項目A,動態鏈接庫項目B,靜態鏈接庫項目C,其中項目A依賴項目B和項目C,則構建解決方案項目結構如下圖所示:
而目錄結構則如下圖所示:
Bin:存放所有動態鏈接庫和可執行程序,分Debug和Release兩個版本
A:應用程序項目文件夾
B:動態鏈接庫項目文件夾
C:靜態鏈接庫項目文件夾
Doc:存放項目文檔
Include:存放引用庫的頭文件
Lib:存放動態鏈接庫的導入庫、靜態鏈接庫
Temp:存放臨時生成文件,其中Compile存放編譯時的中間文件,Link存放鏈接時的輸出文件
除了Doc需要自己建立外,其他文件夾無需手動建立。
項目結構創建步驟:
1.創建一個新應用程序項目,名稱A,解決方案名稱為Work,如下圖所示:
2.在"解決方案資源管理器"右鍵"解決方案Work","添加"→"新建項目"→"Win32"→"Win32 項目",名稱為B,在"應用程序設置"選擇"DLL"和"空項目";
3.同樣的方式添加一個"Win32項目",名稱為C,在"應用程序設置"選擇"靜態庫",去掉"預編譯頭"選項;
4.項目結構如下圖所示:
項目屬性設置
配置項目A的屬性
1.配置"所有配置","常規",
輸出目錄:$(SolutionDir)Temp\Link\$(ProjectName)\$(ConfigurationName)
中間目錄:$(SolutionDir)Temp\Compile\$(ProjectName)\$(ConfigurationName)
2."生成事件"→"生成后事件",
命令行:echo D | xcopy "$(TargetPath)" "$(SolutionDir)Bin\$(ConfigurationName)" /y
3."C/C++"→"常規",
附加包含目錄:$(SolutionDir)Include
4."鏈接器"→"常規",
附加庫目錄:$(SolutionDir)Lib
5."調試",
命令:$(SolutionDir)Bin\$(ConfigurationName)\$(TargetFileName)
工作目錄:$(SolutionDir)Bin\$(ConfigurationName)
配置項目B的屬性
1.配置"所有配置","常規"下,
輸出目錄:$(SolutionDir)Temp\Link\$(ProjectName)\$(ConfigurationName)
中間目錄:$(SolutionDir)Temp\Compile\$(ProjectName)\$(ConfigurationName)
2.配置"Debug","鏈接器"→"常規"下,
輸出文件:$(SolutionDir)Temp\Link\$(ProjectName)\$(ConfigurationName)\$(ProjectName)d.dll
3.配置"所有配置","生成事件"→"生成后事件"下,
命令行:
echo D | xcopy "$(TargetPath)" "$(SolutionDir)Bin\$(ConfigurationName)" /y
echo D | xcopy "$(TargetDir)$(TargetName).lib" "$(SolutionDir)Lib" /y
echo D | xcopy "$(ProjectDir)B.h" "$(SolutionDir)Include" /y
第三行為xcopy動態庫的頭文件,實際要根據所需進行改動名稱。
配置項目C的屬性
1.配置"所有配置","常規"下,
輸出目錄:$(SolutionDir)Temp\Link\$(ProjectName)\$(ConfigurationName)
中間目錄:$(SolutionDir)Temp\Compile\$(ProjectName)\$(ConfigurationName)
2.配置"Debug","管理員"→"常規"下,
輸出文件:$(SolutionDir)Temp\Link\$(ProjectName)\$(ConfigurationName)\$(ProjectName)d.lib
3.配置"所有配置","生成事件"→"生成后事件"下,
命令行:
echo D | xcopy "$(TargetPath)" "$(SolutionDir)Lib" /y
echo D | xcopy "$(ProjectDir)C.h" "$(SolutionDir)Include" /y
第二行為xcopy靜態庫的頭文件,實際要根據所需進行改動名稱。
最后設置項目生成順序
菜單欄→"項目"→"項目依賴項",項目A依賴於B和C,如下圖所示:
編譯生成,可看到如下結果:
用tree命令看下文件夾結構:
其他網上關於目錄結構配置資料:
1.VC 2005 解決方案的目錄結構設置和管理 http://blog.csdn.net/rogeryi/article/details/1481923
2.VC項目管理:目錄結構 http://www.fancystar.org
3.VS2008中VC項目文件目錄的管理 http://qimo601.iteye.com/blog/1059299
4.研發規范-VC http://wenku.baidu.com/view/26f6c789680203d8ce2f2414.html