2012-09-12 34 views
3

我有一個與C++動態庫有關的問題。通常C++動態庫由.lib文件和.dll文件組成。如果我理解的很好,.lib文件會記錄導出的函數的位置,而.dll則包含實現。我知道發佈版本有一些優化,因此發佈DLL和調試DLL應該是不同的。那麼發佈lib文件和調試lib文件的主要區別是什麼?有沒有辦法告訴lib(或dll)文件是發佈版本還是調試版本?如果發佈版本程序調用調試版本庫,會發生什麼情況?謝謝!C++動態發佈庫和調試庫之間有什麼區別?

+0

這似乎更多的是關於一些平臺的動態庫的實現,而不是關於C++。 –

+0

調試版本的內存分配器可能不同,跟蹤更改並可能在元數據前綴內存。混合分配器「不小心」最多會泄漏,並且很可能會導致程序崩潰。 – ixe013

+0

恰好當您在調試應用程序中使用發佈dll或在發佈應用程序中使用調試dll時,您可能會發生奇怪的崩潰,主要是因爲發佈和調試之間的內存分配api不同。 – drescherjm

回答

7

請注意,「發佈」和「調試」只是一整套編譯器和鏈接器標誌和設置的標籤,通常內部「發佈」版本仍會生成調試信息,但會有更高的優化設置。

因此,沒有標準的方式來判斷一個庫或DLL是否是「釋放」或「調試」版本,除非它明確地由類似於「d」後綴或庫的位置表示。

當「釋放」配置可執行文件調用「調試」配置庫時,會發生什麼情況取決於兩者之間的具體編譯和鏈接器設置。在幾乎所有情況下,你都會遇到很多麻煩,有時候會非常公然,有時會更加陰險。

  • 這兩個庫都可能使用不同版本的運行時庫的是,也有應該是靜態的,在所有的庫在同某些變量的不同副本:麻煩一些常見的來源一個可執行文件,如內存分配池及其計數器/標記。一個症狀是你會得到奇怪的內存分配/釋放錯誤。

  • 這些庫可能在標準庫中採用不同的約定,例如安全設置或迭代器調試。這會使「標準」容器的內存佈局在不同的庫中實際上不同,如果你幸運或者不可預知的行爲,那麼你將會遇到訪問違規。

相關問題