2010-03-29 26 views
13

我在VS 2008中創建了一個DLL的解決方案。然後我在另一個應用程序中使用該DLL。如果我進入DLL項目屬性頁面併爲DEBUG構建更改以下配置,則內置的dll不會提供所需的功能。如果我改回來,重建DLL,那麼DLL並提供正確的功能:什麼是VS 2008中的「多線程調試DLL」運行時庫選項?

屬性頁=>配置屬性=> C/C++ =>代碼生成=>運行時庫

如果集到「多線程調試DLL(/ MDD)」 然後一切正常,因爲它應該。我從DLL

正確的功能如果設置爲「多線程DLL(/ MD)」,則DLL功能不正常......不運行時錯誤或任何東西,它只是不工作(DLL應該在地圖上繪製一些線條,但不在此模式下)。

所以現在的問題是,爲什麼不使用底層代碼校正功能/ MDD標誌結果,而/ MD導致不正確的功能?

一點背景...別人開發的DLL在C++中,我使用的VB.net應用這個DLL。

回答

9

所有DLL /調試代碼生成必須在使用它們的所有內容中匹配。可能會有另一個引用的庫或對象或DLL或一些代碼在那裏使用錯誤的選項構建;或覆蓋全局項目選項的單個元素的特定選項。

想出來的唯一辦法是,精心檢查所有的選項,每一個文件,檢查包括和引用的庫(.LIB和.dll)文件和目標文件。檢查鏈接器選項。

爲什麼它不工作的原因可能是因爲調試版本增加了內存周圍額外保護塊允許誤差的檢測。

6

這兩個選項之間的主要區別在於您的代碼將在稍後鏈接的庫中。對於調試版本,例如這將包括LIBCMTD.LIB和其他一些。如果您的庫將作爲調試構建,則應始終使用MDd進行鏈接。如果不這樣做,最多會導致大量未解決的外部鏈接器錯誤。有時代碼通常編譯但在運行時崩潰。如果這發生在vb.net中,那麼catch可以很容易地隱藏錯誤。我想你應該確保你的設置是正確的。有關更詳細的信息,請查詢this

4

我有類似的問題。當其運行時庫設置爲「多線程DLL(/ MD)」時,「使用」第三方DLL的應用程序崩潰,但其運行時庫設置爲「多線程調試DLL(/ MDd)」時工作。

它與通過DLL接口傳遞std :: strings和std :: lists有關。

我們的猜測是這些類型的低級定義在兩個運行時庫中有所不同。

我們使用這個法則... DLL和DLL用戶必須使用完全相同的運行時庫是建立解決我們的相關問題。

相關問題