首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visual调试模式中的错误LNK2005

Visual调试模式中的错误LNK2005
EN

Stack Overflow用户
提问于 2010-10-07 20:17:46
回答 3查看 15.9K关注 0票数 5

我正在将第三方代码集成到Visual 2010下的MFC应用程序中。

在调试模式下,会发生以下生成错误:

代码语言:javascript
复制
1>LIBCMT.lib(invarg.obj) : error LNK2005: __initp_misc_invarg already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __call_reportfault already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __set_invalid_parameter_handler already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __get_invalid_parameter_handler already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invoke_watson@@YAXPBG00II@Z) already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __invalid_parameter already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invalid_parameter@@YAXPBG00II@Z) already defined in libcmtd.lib(invarg.obj)
1>LIBCMT.lib(invarg.obj) : error LNK2005: ___pInvalidArgHandler already defined in libcmtd.lib(invarg.obj)
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>D:\My Documents\Dev\MyProject\MyProject\Debug\MyProject.exe : fatal error LNK1169: one or more multiply defined symbols found

使用这个建议,我能够通过两种方式完成构建:

  • 释放方式
  • 在调试模式中使用/FORCE:MULTIPLE作为附加的链接器命令行选项

在第二种情况下(调试模式),仍然报告了许多警告。如果我也添加了/NODEFAULTLIB:LIBCMT,那么它们中的大多数都消失了。

原因是什么?

我怎样才能解决这个问题,而不是绕过它呢?

EN

回答 3

Stack Overflow用户

发布于 2010-10-07 22:13:49

出于某种原因,您将同时链接到LIBCMT和LIBCMTD (调试版本)。(从读取每个错误行的末尾:already defined in libcmtd.lib(invarg.obj))

你说/NODEFAULTLIB:LIBCMT是正确的。您所链接的第三方库上的调试/发布标志是否与应用程序上的调试/发布模式匹配?我猜第三方代码在某种程度上引入了一个冗余的库。

票数 12
EN

Stack Overflow用户

发布于 2011-06-22 09:08:06

如果你幸运的话,你的第三方包包含一个xxx.lib和一个xxxD.lib,就像LIBCMT一样。然后,您只需链接适当的根据发布/调试。在类似的案子里为我工作过。

票数 0
EN

Stack Overflow用户

发布于 2012-10-11 16:01:23

我以这种方式解决了同样的问题:在解决方案资源管理器>配置参数> C/C++ >代码生成中。在字段中,选择..。对于我的“第三方代码”,我不得不选择多线程(/MTd),它起作用了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3885548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档