我刚尝试使用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”以及以哪种方式解决问题?
答案 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