2013-10-31 244 views
0

我刚刚尝试使用Visual C++ 2012构建一个x64 C++ DLL。它是一个简单的DLL链接另一个静态第三方.lib文件。我收到以下警告消息:在Visual C++ DLL项目中冲突的运行时库

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

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

我从MS和论坛上阅读了关于这个问题的一些页面。但这些网页中没有一个解释了这里的问题到底是什么。

我不明白:

什么是连接使用不同的运行时变种(不是浪费内存除外)代码的危害?有人说这可以忽略,有人说可能不会。

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

回答

3

如果共享C运行时对象(诸如FILE *之类的项目)或共享内存分配(在一部分中分配内存并在另一部分中释放内存),冲突的运行时库可能会导致严重问题。我会避免“强迫”他们在一起,以避免奇怪的问题和崩溃。如果你不能改变lib或你的dll的构建,我会用一个只有C的接口包装这个lib,这个接口不会泄漏任何C运行时对象,或者要求你释放内存之外的内存内部创建的dll。

+0

库已经有一个普通的C API。据我所知,不需要共享分配的内存,因为DLL提供了所有需要的创建和解析功能。似乎lib已经满足您的安全使用规则。 但是,我该如何摆脱恼人的警告?和/ NODEFAULTLIB [:library]有哪些影响? – Silicomancer

+0

对不起,应该阅读“... lib耗材所有需要...” – Silicomancer

+0

我仍然会将其包装到一个DLL。我认为这可能是最简单的路线。 – villintehaspam