2010-09-05 50 views
0

我已經在VS C++ 2010 Express Edition中編寫了一個應用程序,它由一些DLL組成,並且還依賴於一些第三方DLL。 應用程序本身是一個DLL。VS 2010應用程序需要VS運行時安裝 - 如何避免這種情況?

事實證明,要使其在另一臺機器上工作,用戶必須安裝VS 2010可再發行版運行時。

我試圖用標誌/ MT而不是/ MD來構建我的DLL--我相信這意味着我想要靜態鏈接..但是,在這種情況下,我得到了有關MSCVRT.lib的'多重定義'錯誤。錯誤消息還建議使用標誌/NODEFAULTLIB:msvcrt.lib來避免這種情況。但是,使用這些設置我的應用程序仍然需要運行時安裝

有人請解釋我如何避免這種情況?

感謝, 羅布斯塔

更新:如果我簡單的使用/ MT標誌,而不是/ MD我得到以下錯誤

MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" ([email protected]@[email protected]@@Z) already defined in LIBCMT.lib(typinfo.obj) MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" ([email protected]@[email protected]@@Z) already defined in LIBCMT.lib(typinfo.obj) Creating library C:\MyApp\Release\MyApp.lib and object C:\MyApp\Release\MyApp.exp LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library C:\MyApp\Release\MyApp.dll : fatal error LNK1169: one or more multiply defined symbols found

添加標誌/ NODEFAULTLIB後:圖書館我沒有得到任何錯誤,應用程序已成功構建,但仍需要運行時安裝。

是否有可能第三方庫,我也鏈接,需要運行時?

+0

您可以添加詳細信息/標籤,例如您正在使用的語言,您在應用程序中使用的dll引用以及錯誤消息的文本。 – Oded 2010-09-05 14:13:19

+0

我假設你使用VC++? – Excel20 2010-09-05 14:13:51

回答

3

您正在鏈接一些仍然使用/ MD編譯的代碼,可能是某種靜態庫。混合和匹配不起作用。

使用DLL時非常危險。當導出的函數返回需要由客戶端代碼釋放的指針或C++對象時,您會遇到麻煩。例如返回一個std :: string。使用/ MT,客戶端將使用自己的堆分配器釋放內存。無法工作,該DLL使用另一堆。你會泄漏,很難診斷。使用由不同版本的CRT構建的第三方DLL也存在同樣的問題。有更多的細節在這MSDN Library article

使用this download部署所需的CRT DLL非常簡單。

+0

感謝您的警告。因此,您的建議只是承認可再分發安裝是必需的事實? – robusta 2010-09-05 14:29:46

+0

如果你沒有明確地設計DLL導出來解決這個問題(例如COM),那麼,是的,不要搞亂它。這就是5分鐘的時間,這與解決連接器或內存問題的麻煩相比毫無用處。您似乎正在使用第三方代碼,預計可以使用共享CRT,但幾乎可以肯定沒有使用/ MT進行測試。 – 2010-09-05 14:41:22

相關問題