1. 程式人生 > >關於release和debug版本不能混用的教訓

關於release和debug版本不能混用的教訓

之前改老師寫好的MFC的一個影象類的lib庫,重新生成之後,呼叫lib的專案一直報錯。錯誤如下:

圖片描述

大致就是檢測到lib檔案裡各種.obj不匹配。

找了蠻久問題,後來發現是版本不相容的問題。
vs中的工程有debug和release兩個版本,我的lib庫專案用debug版本編譯,呼叫的專案是用release版本編譯的。

需要強調一下:

靜態連結庫的生成與使用需要用相同版本。

為什麼呢?
Debug和Release的本質區別其實就是兩者編譯的方式不同。
很明顯的外在表現就是Debug版本的靜態連結庫一般會比Release版本的大不少。

打個比方,就像ANSI和Unicode,都能表示漢字,但編碼方式不同,不能用ANSI修改Unicode編碼。

兩者詳細一點的區別可以往下看↓:

1. Debug通常稱為除錯版本,通過一系列編譯選項的配合,編譯的結果通常包含除錯資訊,但是不做任何優化(效能有影響),目的是為開發人員提供強大的應用程式除錯能力,也就是說只有在Debug模式下,我們才可以使用vs所提供的所有的程式除錯功能,比如:單步除錯中將游標移至變數處即可以獲取該變數的實時資料。

2. Release通常稱為釋出版本,是為使用者使用的,一般客戶不允許在釋出版本上進行除錯,在Release模式下也無法使用vs所有的除錯功能。所以不儲存除錯資訊,同時,它往往進行了各種優化,以期達到程式碼最小和速度最優。為使用者的使用提供便利。

關於變數的初始化
  debug跟release在初始化變數時所做的操作是不同的,debug是將每個位元組位都賦成0xcc, 而release的賦值近似於隨機。如果你的程式中的某個變數沒被初始化就被引用,在release版本下就很有可能出現異常:用作控制變數將導致流程導向不一致;用作陣列下標將會使程式崩潰;更加可能是造成其他變數的不準確而引起其他的錯誤。

從Debug模式改為Release模式:
- 改為Release模式之後,Debug下的工程設定不會直接copy過來,需要針對當前工程重新設定一次。