0

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

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

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

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

我不明白的是:

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

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

4

2 回答 2

3

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

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

于 2013-10-31T16:54:49.620 回答
3

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

请参阅为什么这个程序会崩溃:在 DLL 之间传递 std::string

于 2013-10-31T16:57:07.607 回答