我一直有以下形式的链接器错误:
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)
你能帮我解决这个问题吗?
答案 0 :(得分:8)
检查一些事项:
您的头文件是否受到保护。即他们有#ifndef
警卫。
您是否在没有inline
关键字的标头中定义(非模板)功能。那会弄乱很多东西。
您是否尝试在.cpp文件中定义模板。所有模板定义都必须在标题中。
请发布一些代码和确切的错误文本!
答案 1 :(得分:4)
您的问题是您要链接两个提供相同符号的文件。
您没有提供真正的错误消息,因此我们无法确切地告诉您问题是什么,但可能是您正在链接来自两个不同版本的Visual Studio的库。
通过搜索网络也可以找到解决方案(我假设你这样做但是错过了有问题的文章:-),建议你可以通过将项目选项从"Multi-threaded Debug(/MTd)"
更改为{{1}来解决问题但我没有看过这个。
请发布完整的错误,以便我们提供更有针对性的帮助。
答案 2 :(得分:2)
确保为Runtime Libary链接选择的选项对于每个项目和库都是相同的。 项目属性 - >配置属性 - > C / C ++ - >代码生成 - >运行时库 - > "多线程" /"多线程DLL" / ...
我的问题是我的所有C ++项目都是"多线程"但是我引用的是Fortran模块,这是多线程DLL"
答案 3 :(得分:1)
LNK4098上的MSDN文章有一个非常有用的表:它会告诉您手动添加到“忽略特定库”列表的库,具体取决于您使用的CRT。您需要选择一个CRT(多线程或非多线程;静态或DLL;调试或发布),然后根据您的选择添加忽略库。
KB154753 ... libraries that a program will link with when built by using Visual C++
中更详细地描述了根本原因我对此的解释是,在某些情况下,自动选择链接代码的CRT库的算法会选择几个冲突的库。