错误LNK2005:" void __cdecl operator delete(void *)" (?? 3 @ YAXPAX @ Z)已在LIBCMTD.lib(delete_scalar.obj)中定义

时间:2017-10-09 03:02:05

标签: c++ mfc static-libraries linker-errors crt

我编写了一个覆盖delete运算符的c ++静态库。 在测试项目中使用库时,项目会产生以下错误:

错误LNK2005:" void __cdecl operator delete(void *)" (?? 3 @ YAXPAX @ Z)已在LIBCMTD.lib中定义(delete_scalar.obj)

在搜索到答案之后,我认为这是由于CRT和MFC库的包含顺序,但在尝试应用解决方案时,所有答案都已过时。我正在使用Visual Studio 2017。

有谁能告诉我如何正确构建我的库?感谢。

编辑 - 我知道一个定义规则。我试图找出如何防止包含LIBCMTD.lib版本。

1 个答案:

答案 0 :(得分:0)

看看这里:

https://docs.microsoft.com/en-gb/cpp/error-messages/tool-errors/linker-tools-error-lnk2005

您将在文章中看到几个原因。例如:

  

如果链接多个版本的标准,则会发生此错误   图书馆或CRT。例如,如果您尝试链接两个零售店   和调试CRT库,或者静态和动态版本的   库,或两个不同版本的标准库   可执行文件,可能会多次报告此错误。要解决这个问题,   从链接命令中删除每个库的所有副本。我们的确是   不建议你混合零售和调试库,或者不同   库的版本,在同一个可执行文件中。

     

告诉链接器使用默认值以外的库   命令行,指定要使用的库,并使用/NODEFAULTLIB   用于禁用默认库的选项。在IDE中,添加对引用   你的项目指定要使用的库,然后打开   项目的属性页对话框,链接器输入   属性页,设置忽略所有默认库忽略   特定默认库属性以禁用默认值   库。

我过去必须这样做。