我编写了一个覆盖delete运算符的c ++静态库。 在测试项目中使用库时,项目会产生以下错误:
错误LNK2005:" void __cdecl operator delete(void *)" (?? 3 @ YAXPAX @ Z)已在LIBCMTD.lib中定义(delete_scalar.obj)
在搜索到答案之后,我认为这是由于CRT和MFC库的包含顺序,但在尝试应用解决方案时,所有答案都已过时。我正在使用Visual Studio 2017。
有谁能告诉我如何正确构建我的库?感谢。
编辑 - 我知道一个定义规则。我试图找出如何防止包含LIBCMTD.lib版本。
答案 0 :(得分:0)
看看这里:
https://docs.microsoft.com/en-gb/cpp/error-messages/tool-errors/linker-tools-error-lnk2005
您将在文章中看到几个原因。例如:
如果链接多个版本的标准,则会发生此错误 图书馆或CRT。例如,如果您尝试链接两个零售店 和调试CRT库,或者静态和动态版本的 库,或两个不同版本的标准库 可执行文件,可能会多次报告此错误。要解决这个问题, 从链接命令中删除每个库的所有副本。我们的确是 不建议你混合零售和调试库,或者不同 库的版本,在同一个可执行文件中。
告诉链接器使用默认值以外的库 命令行,指定要使用的库,并使用
/NODEFAULTLIB
用于禁用默认库的选项。在IDE中,添加对引用 你的项目指定要使用的库,然后打开 项目的属性页对话框,链接器,输入 属性页,设置忽略所有默认库或忽略 特定默认库属性以禁用默认值 库。
我过去必须这样做。