2012-07-25 24 views
15

在調試二進制文件中使用第三方庫的發佈版本是不好的做法嗎?混合調試和發佈庫/二進制文件 - 不好的做法?

我正在使用第三方庫並編譯了一個發佈.lib庫。我的exe是在調試模式下開發的。然後我:

error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in test1.obj 

一些谷歌上搜索,我發現那是因爲我想與調試混合出獄後,我也許應該編譯庫在調試模式或與_ITERATOR_DEBUG_LEVEL宏觀否則矇混過關。但我只是好奇,如果這是推薦的方式和原因。我需要爲每個我打算使用的第三方庫編譯和保存一個發行版和調試二進制文件的記錄,這很快就會很多,而無意調試到這些代碼。

+0

您無法聯繫該第三方獲取調試版本或自己構建調試版本嗎? – 2012-07-25 21:35:26

+0

這不僅僅是壞習慣:它幾乎可以保證程序會崩潰或做壞事。在VS2010之前,無論如何你都可以連接,在運行時發現奇怪的錯誤。現在至少你被阻止了。 – 2012-07-25 21:40:58

+1

@JesseGood是的,我有源代碼,我剛剛編譯調試版本。問題解決了。我只是想知道如果我能編譯和跟蹤一種模式,我是否可以逃脫。顯然不是! – 2012-07-25 21:58:41

回答

26

混合調試和發佈代碼是不好的做法。問題在於不同的版本可能依賴於C++運行時庫的不同基本部分,例如內存如何分配,迭代器的結構可能會不同,可能會生成額外的代碼以執行操作(例如,檢查迭代器)。

與使用任何其他不同設置構建的混合庫文件相同。想象一下,頭文件包含應用程序和庫都使用的結構的情況。該庫的結構打包和對齊設置爲一個值,並且應用程序使用另一個值創建。無法保證將結構從應用程序傳遞到圖書館將起作用,因爲它們的大小和成員位置可能會有所不同。

是否有可能將您的第三方庫構建爲DLL?假設任何函數的接口都更清晰,並且不會嘗試傳遞任何STL對象,那麼您將能夠將調試應用程序與發佈DLL混合使用,而不會出現任何問題。

+0

特別是,std容器和迭代器是不同的並且不兼容。這是你看到的檢查:它通過添加額外的字段影響迭代器的佈局。 std :: string的東西(只)支持Debug和Release之間的兼容性,但是stl中沒有其他東西可以工作。 – 2014-09-15 22:44:09

+2

@JDługoszstd :: string在運行時間之間顯式不兼容。一個有趣的練習是創建一個只包含函數'__declspec(dllexport)std :: string make_string()'的DLL,在Debug中構建,然後構建一個Release可執行文件,並鏈接並調用該函數。當我試圖將'std :: cout'作爲返回的字符串時,由此產生的崩潰非常顯着。這是使用VS2013,但它肯定是VS2010的問題,我也期待其他版本。 [這是](https://blogs.msdn.microsoft.com/vcblog/2014/06/10/the-great-c-runtime-crt-refactoring/)從馬的嘴裏的一些信息。 – Rai 2016-05-26 07:13:23

+0

那麼,我已經挖到的特定版本有代碼進行調試並釋放std字符串(迭代器或值;不再記得了)相互兼容。我確實比VS2010年老,但我不記得它是多久以前。 – 2016-05-26 19:39:13

5

事實上,它不編譯應該足以證明這是不好的做法。

關於維護獨立的構建 - 你不需要那樣做。這裏有一個解決方法,以前爲我工作:

#ifdef _DEBUG 
#define DEBUG_WAS_DEFINED 
#undef _DEBUG 
#endif 

#include <culprit> 

#ifdef DEBUG_WAS_DEFINED 
#define _DEBUG 
#endif 

讓我知道這是否適合你。

相關問題