我有一個託管的C++ DLL使用非託管C++庫。我在託管項目的「其他依賴項」中添加了lib文件。不幸的是,我得到了十幾個已經在msvcprtd.lib中定義的鏈接錯誤的std :: locale。鏈接錯誤 - >託管DLL到非託管庫
有什麼想法?我是否必須構建爲dll並將它們鏈接在一起?
我有一個託管的C++ DLL使用非託管C++庫。我在託管項目的「其他依賴項」中添加了lib文件。不幸的是,我得到了十幾個已經在msvcprtd.lib中定義的鏈接錯誤的std :: locale。鏈接錯誤 - >託管DLL到非託管庫
有什麼想法?我是否必須構建爲dll並將它們鏈接在一起?
您可能需要更改其中一個項目的運行時庫設置,以使它們都相同。運行時庫設置中的「多線程調試DLL」選項意味着您的項目將與DLL版本的運行時鏈接鏈接,而不是您的項目是DLL。 「多線程調試」意味着它將鏈接到標準庫的.lib版本。
當您將兩個使用不同設置的項目鏈接在一起時,它們最終會有重複的引用。一個來自靜態運行時庫的引用,另一個來自DLL運行時庫。這是你的錯誤的來源。
您應該選擇哪個設置取決於您是否要將運行時DLL分配給您的項目(或者指望用戶已經擁有它們)。如果您想要使用此選項,請選擇DLL運行時庫,否則請選擇非DLL版本。非DLL版本的缺點是,所有運行時庫代碼都將嵌入到DLL/EXE中,這會增加它的大小。
編輯:其實,看着它更多一點。 This link表示在使用CLR項目(我懷疑你的項目是被管理的C++)時,不能使用靜態鏈接選項,因此您需要對兩者都使用「多線程調試DLL」選項。
您是否檢查過兩個項目正在使用哪個運行時庫?在C/C++ - >代碼生成 - >運行時庫下。它可能是不相關的,但每當我得到這樣的錯誤時,通常是因爲運行時庫不匹配。 – obmarg 2011-12-16 12:31:36