错误 LNK2005:“void __cdecl 运算符删除(void *)”(??3@YAXPAX@Z) 已在 LBCMTD.lib(delete_scalar.obj) 中定义

Jes*_*ter 5 c++ mfc crt linker-errors static-libraries

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

错误 LNK2005:“void __cdecl 运算符删除(void *)”(??3@YAXPAX@Z) 已在 LBCMTD.lib(delete_scalar.obj) 中定义

寻找答案后,我相信这是由于 CRT 和 MFC 库的包含顺序造成的,但在尝试应用该解决方案时,所有答案都显得过时。我正在使用 Visual Studio 2017。

谁能告诉我如何正确构建我的图书馆?谢谢。

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

And*_*kle 1

看看这里:

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

正如您将在本文中看到的,有几个原因。例如:

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

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

我过去曾不得不这样做。