簡體   English   中英

在C ++中使用調試/發行版DLL

[英]Using debug/release versions DLL in C++

我正在編寫一個可以在Linux(gcc 4.3)和Windows(MS VS08 Express)下編譯的C ++應用程序。

我的應用程序使用第三方庫,

Linux上 ,它們被編譯為共享庫,而在Windows上 ,有兩個版本“ Debug”和“ Release”。

我知道調試版本為調試提供了額外的支持(就像在Linux gcc中使用-ggdb選項一樣,對嗎?)

但是我發現,如果我的應用程序處於調試版本,則這些庫也必須處於調試版本,否則應用程序將崩潰。

為什么會有這樣的限制? 似乎在Linux世界中沒有這樣的限制

非常感謝你!

程序的Debug配置是使用完整的符號調試信息編譯的,並且沒有優化。 優化使調試復雜化,因為源代碼和生成的指令之間的關系更加復雜。

程序的Release配置不包含符號調試信息,並且已完全優化。 可以根據所使用的編譯器選項在PDB文件(C ++)中生成調試信息。 如果以后需要調試發行版,則創建PDB文件可能非常有用。

調試與發布

也可以使用編譯器標志調試發行版。

調試發行版

  • 堆布局-保護字節以防止覆蓋
  • 編譯-刪除斷言/調試信息
  • 指針支持-指針周圍的緩沖區可防止seg錯誤
  • 優化-內聯函數

創建發行版本時的常見問題

詳細闡述馬丁·托恩沃爾。 在Debug或Release中鏈接的各種庫

  • LIBCPMT.LIB,多線程,靜態鏈接,/ MT,_MT

  • LIBCPMTD.LIB,多線程,靜態鏈接,/ MTd,_DEBUG,_MT

CRT庫

最有可能的是,發行版和調試版鏈接到C ++運行時庫的不同版本。 通常,調試版本會鏈接到“多線程調試DLL”運行時,而發布版本通常會鏈接到“多線程DLL”。 加載運行時庫與應用程序庫不匹配的DLL通常會導致神秘的崩潰。

您可以嘗試驗證所有DLL是根據與應用程序相同的運行時庫構建的,而不管哪個配置(調試或發布)處於活動狀態。 這是否令人滿意,完全是另一個問題。

選擇要鏈接到哪個運行時庫的功能使應用程序開發人員可以根據應用程序的需求選擇最佳功能集。 例如,如果單線程應用程序與考慮了線程安全性的運行時庫鏈接,則可能會由於不必要的線程同步而導致性能下降。 同樣,將多線程應用程序鏈接到單線程運行時的后果可能是災難性的。

盡管我從來沒有故意鏈接使用不同的編譯器設置構建的庫,但是這樣做沒有多大意義,但我只知道Dinkumware實現(一個MSFT使用的)中的STL類會導致此問題。

它們支持一項稱為“迭代器調試”的功能,該功能在調試配置中默認情況下處於啟用狀態。 這會將成員添加到類中以幫助診斷代碼。 使它們更大。 當您在使用一個設置編譯的代碼塊中創建對象並將其傳遞給使用相反設置編譯的代碼時,這將變得很糟糕。 您可以通過將_HAS_ITERATOR_DEBUGGING宏設置為0來關閉此功能。這是一個很大的損失,該功能非常適合診斷使用STL類的錯誤。

如果您不仔細控制編譯設置,則在不同庫之間傳遞對象或指針總是一個問題。 混合並匹配CRT版本和風味會給您帶來麻煩。 通常,這會從鏈接器生成警告,不確定您沒有看到什么。 如果代碼駐留在DLL中,將不會存在。

暫無
暫無

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

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