維尼的蜂巢

Archive for 四月 19th, 2006

release和debug的不同

Posted by: kevinlin on: 四月 19, 2006

有時候常常會遇到Debug可以跑 但是Release反而不能跑了 為什麼呢?
這實在很奧妙 所以要好好了解一下這兩個的差異
還有 所以我們常常需要在一個階段就Release編譯一次 這樣才不會最後手足無措 
Debug 版本
參數 含義
/MDd /MLd 或 /MTd 使用 Debug runtime library (測試版本的執行時函式庫)
/Od 關閉最佳化開關
/D “_DEBUG” 相當於 #define _DEBUG,打開編譯測試程式碼開關 (主要針對assert函數)
/ZI 建立 Edit and continue(編輯繼續)資料庫,這樣在測試過程中如果修改了程式碼不需重新編譯
/GZ 可以幫助取得記憶體的錯誤
/Gm 打開最小化重鏈接開關 減少鏈接時間
Release 版本
參數 含義
/MD /ML 或 /MT 使用發佈版本的執行時函式庫
/O1 或 /O2 最佳化開關,使程式最小或最快
/D “NDEBUG” 關閉條件編譯測試程式碼開關 (即不編譯assert函數)
/GF 合併重複的字串, 並將字串常數放到ROM中, 防止被修改
事實上呢 Debug 和 Release 並沒有本質的界限 他們只是一組編譯選項的集合 編譯器只是按照預定的選項行動。
事實上 我們甚至可以修改這些選項 從而得到最佳化過的測試版本或是帶跟蹤語法的正式版本。
哪些情況下 Release 版會出錯
有了上面的介紹,我們再來逐個對照這些選項看看 Release 版錯誤是怎樣產生的
1、Runtime [...]