如何在Visual Studio中解决链接错误(LNK2005)?

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)中已经定义
你能帮我解决这个问题吗?

我遇到了与“type_info”类完全相同的链接器问题。 我从Multithreaded-Debug-DLL更改为Multithreaded-Debug。 在此之前,一切正常。 但是,为了使我的程序在不同的计算机上运行,我需要Multithreaded-Debug。 你找到解决方案了吗? - Ralph Tandetzky
4个回答

11

请检查以下几点:

  1. 您的头文件是否添加了保护程序,即是否拥有 #ifndef 声明。

  2. 如果您在头文件中定义(非模板)函数,是否没有添加 inline 关键字。这会引起很多问题。

  3. 您是否尝试在 .cpp 文件中定义模板。所有的模板定义都需要在头文件中完成。

请贴上代码和完整错误信息!


1
当我使用C++时,lnk2005错误困扰了我好几天,解决方法是使用#ifndef保护。 - Joseph Yaduvanshi

4
你的问题是连接了两个提供相同符号的文件。
你没有提供真正的错误信息,所以我们无法确定问题的具体情况,但很可能是你正在链接来自Visual Studio不同版本的库。
还有一些解决方案可以通过搜索网络获得(我假设你已经这样做了,但只是错过了相关文章: -) ,建议你将项目选项从"Multi-threaded Debug(/MTd)"更改为"Multi-threaded Debug DLL(/MTD)",但我没有深入研究。
请发布完整的错误信息,以便我们能够提供更有针对性的帮助。

请检查这个链接。该链接与 Visual C++ 运行时库链接器问题有关。 - Cute

2
请确保您为每个项目和库选择的运行时库链接选项相同。 项目属性 -> 配置属性 -> C/C++ -> 代码生成 -> 运行时库 -> "多线程" / "多线程 DLL" / ... 我的问题是,我所有的C++项目都是“多线程”,但我引用的Fortran模块是“多线程DLL”。

1

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

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

我的理解是,在某些情况下,自动选择与您的代码链接的CRT库的算法将选择几个冲突的库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接