2012-06-17 14 views
1

我正在建立一個應用程序依賴boost。我的應用程序輸出是最終被另一個客戶端應用程序使用的庫。我最近發現我在調試模式下使用/ MDd生成代碼(調試CRT庫),並且即使在調試模式下,客戶端應用程序也是針對發佈CRT構建的。因此,這可能會導致一些內存堆損壞錯誤。爲了證實這一點,我在釋放模式下測試了所有的東西,並且在這裏一切正常。建立應用程序在調試釋放與助推依賴問題的CRT

爲了解決這個問題,我在調試模式下構建了我的應用程序,針對CRT發佈庫......但現在我的應用程序(在獨立測試中)在運行時失敗。我的理解是這是由於boost的依賴關係,並且boost調試可能是針對調試CRT庫而建立的?我查看了boost文檔,但無法準確找到我想要的內容......如何在發佈CRT時重建boost(在調試模式下)?欣賞任何幫助/想法/例子。謝謝你的時間!

回答

1

我以前也有類似的問題。我通過僅使用打開調試功能的發佈版本解決了這個問題。您可以更改默認的發佈配置以生成所有必需的調試信息,並省略優化或其中的一些優化,或者可以創建默認發佈配置的克隆,以使您擁有原始(即真正的發行版)和調試 - 啓用發佈配置。

+0

謝謝@Kepp,我試着做一個「帶有調試信息的版本」(也就是不久前)。但是現在我在測試我的示例時在客戶端應用程序中看到了一些奇怪的行爲。確切地說,當我將字符串賦值爲std :: string client_str = some_namespace_in_library :: class_name :: string_name;我發現client_str沒有分配,而是保持空白。有任何想法嗎?? –

2

除了@ AlKepp的回答,我想建議看看Dependency Walker(http://dependencywalker.com/)。這是一個免費的工具,向您顯示您的庫或應用程序依賴於哪些庫。通常你應該確保只有Release或Debug版本的Microsoft C/C++ Runtime DLL出現(例如MSVCP90.DLL vs MSVCP90D.DLL)。

如果您的應用程序加載在運行時更加庫(例如插件),請從的Dependency Walker使用Profile->Start Profiling應用。然後它會向您顯示在執行期間實際加載或嘗試加載的所有庫。

這對解決任何依賴性問題有很大的幫助,尤其是在這種意外混合發佈和調試版本的情況下,這非常有幫助。

+0

Thanks @Johannes:我已經測試過Depends,是的,正如預期的那樣。但我也在這裏閱讀http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/0f627804-d4d6-4606-bb2a-a5cc0516767d,只要我們完全分配/取消分配第三方DLL(在這種情況下,我的應用程序),它應該是確定的。因此,例如,將字符串作爲const-ref傳遞給DLL邊界應該沒問題。 –

相關問題