簡體   English   中英

混合調試和發布庫/二進制文件 - 不好的做法?

[英]Mixing debug and release library/binary - bad practice?

在調試二進制文件中使用 3rd 方庫的發布版本是一種不好的做法嗎?

我正在使用第 3 方庫並編譯了發布 .lib 庫。 我的 exe 處於調試模式開發。 然后我得到:

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

經過一番谷歌搜索后,我發現這是因為我試圖將發布與調試混合在一起,我可能應該在調試模式下編譯庫,或者以其他方式混淆 _ITERATOR_DEBUG_LEVEL 宏。 但我只是好奇這是否是推薦的方式以及為什么。 我需要為我打算使用的每個 3rd 方庫編譯並記錄發布和調試二進制文件,這似乎很麻煩,這很快就會很多,同時無意調試這些代碼。

混合調試和發布代碼是不好的做法。 問題是不同的版本可能取決於 C++ 運行時庫的不同基本部分,例如內存分配方式、迭代器等結構可能不同,可能會生成額外代碼來執行操作(例如檢查迭代器)。

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

是否可以將您的 3rd 方庫構建為 DLL? 假設任何函數的接口都更干凈並且不嘗試傳遞任何 STL 對象,那么您將能夠將調試應用程序與發布 DLL 混合使用而不會出現問題。

混合調試和發布庫/二進制文件是很好且非常有用的做法。

調試大型解決方案(例如 100 多個項目)通常速度不快,甚至根本不可能(例如,並非所有項目都可以在調試中構建)。 以前的評論員寫道,調試/發布二進制文件可能有不同的對齊方式或其他人員。 這不是真的。 調試和發布二進制文件中的所有鏈接參數都是相同的,因為它們依賴於相同的體系結構。

您必須從所選項目中刪除所有優化 (/Od)。 然后分配一個發布 c++ 運行時。

問題出現是因為您在項目中定義了 _DEBUG。 從定義中刪除宏(項目->屬性->預處理器->預處理器定義)。

如果宏不在預處理器定義中,則必須將其添加到“UndefinePreprocessorDefinitions”中。

它無法編譯的事實足以證明這是不好的做法。

關於維護單獨的構建 - 你不需要這樣做。 這是以前對我有用的解決方法:

#ifdef _DEBUG
#define DEBUG_WAS_DEFINED
#undef _DEBUG
#endif

#include <culprit>

#ifdef DEBUG_WAS_DEFINED
#define _DEBUG
#endif

讓我知道這是否適合您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM