6

我一直有以下形式的链接器错误:

libcmtd.dll msvmrtd.dll一些元素(例如: _mkdir )已经定义...

而且我不知道如何解决它们。

这是一个完整的错误信息:

private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已经在 LIBCMTD.lib(typinfo.obj) 中定义

MSVCRTD.lib(ti_inst.obj) : 错误 LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) 已在 LIBCMTD.lib 中定义(typinfo.obj)

你能帮我解决这个问题吗?

4

4 回答 4

11

检查几件事:

  1. 您的头文件是否受到保护。即他们有#ifndef警卫。

  2. inline您是否在没有关键字的标题中定义(非模板)函数。这会弄乱很多东西。

  3. 您是否尝试在 .cpp 文件中定义模板。所有模板定义都需要在标题中。

请发布一些代码和确切的错误文本!

于 2009-06-04T07:30:59.127 回答
4

您的问题是您正在链接两个提供相同符号的文件。

您尚未提供真正的错误消息,因此我们无法准确告诉您问题出在哪里,但很可能是您正在链接来自两个不同版本的 Visual Studio 的库。

通过搜索网络也有可用的解决方案(我假设您这样做了,但只是错过了有问题的文章:-),这表明您可以通过将项目选项从更改为来解决问题,"Multi-threaded Debug(/MTd)""Multi-threaded Debug DLL (/MTD)"我没有对此进行研究。

请发布完整的错误,以便我们提供更有针对性的帮助。

于 2009-06-04T07:18:39.200 回答
2

确保您为运行时库链接选择的选项对于每个项目和库都相同。项目属性 -> 配置属性 -> C/C++ -> 代码生成 -> 运行时库 -> “多线程” / “多线程 DLL” / ...

我的问题是我所有的 C++ 项目都是“多线程”的,但我引用的是“多线程 DLL”的 fortran 模块

于 2016-03-15T20:21:48.633 回答
1

LNK4098上的 MSDN 文章有一个非常有用的表:它告诉您要手动将哪些库添加到“忽略特定库”列表中,具体取决于您使用的 CRT。您需要选择一个 CRT(是否为多线程;静态或 DLL;调试或发布),然后根据您的选择添加忽略库。

根本原因在KB154753 中有更详细的描述......当使用 Visual C++ 构建程序时将链接的库

我对此的解释是,在某些情况下,自动选择哪些 CRT 库来链接你的代码的算法会选择几个冲突的库。

于 2010-02-09T00:50:15.297 回答