Visuals studio 2005專案屬性配置要點
要程式設計開發產品,除了對程式語言的運用外,還需要一個協助你程式設計的環境。現代的開發工具功能異常強大,方便地重構,程式碼自動補全,各種除錯神器,讓你做起事來事半功倍。我是用Visual studio 2005來做開發的,今天猛地發現,原來對這個環境還有很多東西值得我們去探究。
Debug 和 Release的區別
Debug顧名思義就是除錯版,生成的程式沒有經過優化並且包含跟蹤需要的除錯資訊,在程式執行時,可以設定斷點,檢視斷點發生時,所有變數的值。加上Visual stdio IDE配套的各種除錯神器,Call Stacks,Memory, Watch等等,再配上斷點設定策略(資料斷點,函式斷點), 為程式查BUG提供了強大的支援。
Release版就是釋出版,通常不加入任何除錯資訊,可執行檔案比除錯版的要小得多,並且優化為速度最快。
右鍵專案Properties,-> Configuration Properties-> C/C++ -> General下,有個Debug Information Format選項。Debug版的一般選擇Program Database (/Zi),生成記錄除錯資訊的.pdb檔案,Release版的一般選擇為Disabled.
右鍵專案Properties -> Configuration Properties -> C/C++ ->Optimization 下,有個Optimization選項,Debug版的一般選擇 Disabled, Release版的一般選擇Maximize Speed (/O2)優化為最快速度。
右鍵專案 Properties -> Configuration Properties -> Linker ->Debugging 下,Generate Debug Info 選項,Debug版的一般選擇Yes (/DEBUG) , Release版的一般選擇No。
MDd,MD,MTd,MT的區別
在Visual studio開發環境中 ,右鍵專案Properties ->Configuration Properties -> C/C++ -> Code Generation下,有個Runtime Library選項。
分別是
Multi-threaded Debug DLL (/MDd)
Multi-threaded DLL (/MD)
Multi-threaded Debug (/MTd)
Multi-threaded (/MT)
MD 指的是 Multi-threaded DLL,使用多執行緒的動態庫版本的執行庫。
MT指的是 Multi-threaded ,使用多執行緒的非動態庫版本(靜態連結的版本)執行庫。
MD 或MT後加上個d,表示除錯版(Debug),無論你使用動態庫版本的還是靜態連結版本的執行庫,如果你在除錯程式的話,就得選用帶d的。因為帶d的才有除錯資訊,在除錯的時候才能跟蹤進去。
在一個工程裡面,執行庫只能選擇使用其中一種,如果既選擇了動態庫版本(連結MSVCRT.lib.,執行時需要MSVCRT.dll),又選擇靜態庫版本(連結LIBCMT.lib)的話,執行庫就會被重複定義,編譯的時候就會出錯。所以一個工程,包括它所依賴的靜態庫工程,都得統一執行庫的版本。要麼都使用MT,要麼都使用MD。
因為MFC也會用到執行庫,所以如果使用了MFC的類的話,MFC的執行庫也是要和工程的統一起來,在右鍵專案Properties ->Configuration Properties -> General下的Use of MFC選項,如果使用動態庫版本的執行庫,那就得選擇Use MFC in a Shared DLL,如果使用靜態連結的的執行庫,那就選擇UseMFC in a Static Library。如果沒有用到MFC的話,那麼選擇Use Standard Windows Libraries就可以了。
一個工程使用MT或者MTd靜態連結的執行庫時也會有可能出現編譯錯誤,說某些函式重複定義。如下:
uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecloperator new(unsigned int)" ([email protected]@Z) already defined inLIBCMTD.lib(new.obj)
如果遇到uafxcwd.lib(除錯版的帶d)或者msvcrtd.lib(除錯版的帶d)的某某函式已經在libcmtd.lib(除錯版的帶d)裡定義的編譯錯誤,那是因為CRT 庫對 new、delete 和 DllMain 函式使用弱外部連結。MFC 庫也包含 new、delete 和DllMain 函式。這些函式要求先連結 MFC 庫,然後再連結 CRT 庫。
只要右鍵專案Properties -> Configuration Properties -> Linker -> Input下的 Ignore Specified Library選項填上 uafxcwd.liblibcmtd.lib , 把這兩個庫都忽略,然後在Linker->Input 下的Additional Dependencies加上 uafxcwd.liblibcmtd.lib(先連結MFC的,再連結CRT),即可解決。
解決方案的配置
在Visual studio 2005在工具欄中有一個設定Solution Configuration的下拉框,設定當前的解決方案的配置,預設有Debug,和Release兩種選擇。上面提到有MT,MD兩大類別,所以我們可以在裡面新增MD_Debug,MD_Release,MT_Debug,MT_Release等,每當我們選定一個配置的時候,Configuration Manager會列出當前解決方案下的所有工程對應當前配置的配置。如下圖。
我們可以點選對應工程的Configuration的下拉框,設定當前MT_Debug配置下,該工程對應的配置名稱,每個工程預設也是隻有Debug和Release的,如果需要增加,也可以對每一個工程進行配置。
當這些都配置好以後,我們就可以非常方便地切換到不同的版本去生成程式。