【问题标题】:How can I resolve this link error in Visual Studio (LNK2005)?如何解决 Visual Studio (LNK2005) 中的此链接错误?
【发布时间】:2010-10-31 05:53:15
【问题描述】:

我不断遇到以下形式的链接器错误:

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

我不知道如何解决它们。

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

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

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

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

【问题讨论】:

  • type_info 类的链接器问题完全相同。我从多线程调试 DLL 更改为多线程调试。在此之前,一切正常。但是,我需要多线程调试才能让我的程序在不同的计算机上运行。你找到解决办法了吗?

标签: visual-c++ visual-studio-2005 msvcrt crt


【解决方案1】:

检查几件事:

  1. 您的头文件是否受到保护。 IE。他们有#ifndef 守卫吗?

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

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

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

【讨论】:

  • +1:当我使用 C++ 和 lnk2005 错误困扰了我好几天,修复是 #ifndef 警卫。
【解决方案2】:

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

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

还可以通过搜索网络获得解决方案(我假设您这样做了,但只是错过了有问题的文章 :-) 建议您可以通过将项目选项从 "Multi-threaded Debug(/MTd)" 更改为 "Multi-threaded Debug DLL (/MTD)" 来解决问题,但我没看过这个。

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

【讨论】:

【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    KB154753 ... libraries that a program will link with when built by using Visual C++ 中更详细地描述了根本原因

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2011-10-17
      • 2021-12-10
      • 2014-01-10
      • 1970-01-01
      相关资源
      最近更新 更多