Visual C ++ DLL项目中的运行时库冲突

时间:2013-10-31 16:46:34

标签: c++ visual-c++ dll linker visual-c++-runtime

我刚尝试使用Visual C ++ 2012构建x64 C ++ DLL。它是一个简单的DLL链接另一个静态第三方.lib文件。我收到以下警告信息:

警告LNK4098:defaultlib'LIBCMT'与其他lib的使用冲突;使用/ NODEFAULTLIB:库

似乎其他库使用/ MT(多线程静态运行时)链接器选项,而我的DLL(以及导入我的DLL的所有其他项目)使用/ MD(多线程DLL运行时)。我无法协调这一点,因为第三方lib按原样交付,更改我的DLL会在使用我的DLL的所有项目中产生相同的问题。

我从MS和论坛上读到了有关此问题的一些页面。但是这些页面没有解释这里究竟是什么问题。

我不明白:

链接使用不同运行时变体的代码(除了浪费内存)有什么危害?有人说这可以忽略不计,有人说可能没有。

使用/ NODEFAULTLIB [:library]可以吗?该文档称它将“在解析外部引用时从其搜索的库列表中删除指定的库”。我应该将哪个库添加为“:library”以及以哪种方式解决问题?

2 个答案:

答案 0 :(得分:3)

如果您正在共享C运行时对象(诸如FILE *之类的项目)或共享内存分配(在一个部分中分配内存并在另一部分中释放它),则冲突的运行时库可能会导致严重问题。我会避免“强迫”他们在一起,以避免奇怪的问题和崩溃。

相反,如果你不能改变lib或你的dll的构建,我会将lib包装在一个带有C的接口的dll中,该接口不会泄漏任何C运行时对象或要求你释放内存之外的内存在里面创建的dll。

答案 1 :(得分:3)

例如,传递STL类型(例如std::string)可能会因内部对象布局和/或内存处理的不同而导致严重崩溃

请参阅Why does this program crash: passing of std::string between DLLs