關(guān)于bin和obj文件夾。debug 和release的區(qū)別(轉(zhuǎn))
(2010-04-19 14:11:14) bin是放最終代碼的目錄
obj就放中間代碼的目錄
release和debug是不同的運行方式
debug會增加調(diào)試代碼,方便調(diào)試。調(diào)試完后,用release版本發(fā)布,沒有調(diào)試代碼,減小程序體積,加快執(zhí)行速度!Top
既然obj就放中間代碼的目錄,為什嗎還要release呢?同理,既然bin是放最終代碼的目錄還要debug干什嗎?不是多此一舉嗎?Top
哎!
一、先說說 編譯:
編譯一個源程序文件,要經(jīng)過
語法、類型,甚至要判斷執(zhí)行時的可行性等。
是一個對文件多次掃描的過程,最后還有代碼優(yōu)化的過程。會有一大堆的中間文件產(chǎn)生。vc6下的一個mfc項目 obj目錄里會有好幾M的中間(臨時)文件。
再復(fù)雜點,一個project有圖片(聲音)等資源文件,要調(diào)用其他DLL類庫(可能是.net組件,可能是com),還可能由多個.cs文件組成。要把這么多東西連接在一起。以前在DOS下用C或PASCAL,要先編譯成.obj文件,再用link.exe連接在一起,才是一個exe文件。(記得pascal還是fortran要用兩個編譯程序才能得到一個.obj的中間文件)
結(jié)論:編譯需要大量的中間文件存放臨時結(jié)果,為下一步做準(zhǔn)備。C#是面向?qū)ο蟮膹?fù)雜度更高!obj目錄就是用來存放臨時文件的!
二、debug & release
debug調(diào)試,你在程序中設(shè)置了斷點,為什么vs.net知道在那里要停下來,當(dāng)你把鼠標(biāo)移到某個變量上,vs.net就會顯示它當(dāng)時的值?
因為編譯器在代碼中添加了許多調(diào)試需要的代碼,可以讓vs.net得到,返回給你。
這些代碼當(dāng)然是要占用空間和時間的,在你的程序調(diào)試完了后,可以正確運行了。完全可以去掉這些代碼,這時候就應(yīng)該用Release模式了。
不管Debug還是Release模式,都要編譯,都有中間臨時代碼產(chǎn)生,所以obj目錄下有debug release目錄。兩種模式編譯的結(jié)果,就放在bin目錄下。
編譯完后,中間臨時代碼是沒什么用的了,所以一般不管obj目錄里的東西!
各位說說,我是不是可以去寫書了? :)
在用VC編譯是,有debug和release兩種
有什么區(qū)別呢
一個為調(diào)試版本,其中包括了出錯時能夠定位源代碼的在行,如果源文件已經(jīng)改變,定位出來會有偏移,而且,在這個版本中編譯器不會進行代碼優(yōu)化,并且在程序中能用宏定義_DEBUG來確定當(dāng)前的版本。另一個為正試版本,程序出錯只是進行簡單的錯誤處理,編譯器會優(yōu)化代碼,以提高性能。
Release代碼更小,執(zhí)行更快,編譯更嚴(yán)格,更慢
當(dāng)然就沒有了調(diào)試信息
經(jīng)常你會遇到DEBUG成功的版本RELEASE 就有問題,以下是問題的分析總結(jié)
DEBUG和RELEASE 版本差異及調(diào)試相關(guān)問題:
. 內(nèi)存分配問題
1. 變量未初始化。下面的程序在debug中運行的很好。
thing * search(thing * something)
BOOL found;
for(int i = 0; i < whatever.GetSize(); i++)
{
if(whatever[i]->field == something->field)
{
found = TRUE;