全局删除冲突重载

Posted

技术标签:

【中文标题】全局删除冲突重载【英文标题】:Conflicting overloads of global delete 【发布时间】:2017-01-20 08:11:25 【问题描述】:

我正在尝试在现有 c++ 代码库和 c# wpf 应用程序之间编写 CLI 互操作层。为了实现我自己的内存跟踪和其他细节,我的 c++ 库已经重载了全局 new 和 delete。所以依赖项看起来像这样:

(编译成静态库的原生库)->(CLI层)->(C# WPF应用)

但是,每当我包含我的本机库并尝试构建我的 CLI 项目时,我都会遇到一个冲突的全局删除符号,该符号已在 msvcrtd 中定义:

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

我不确定如何让我的构建使用我的全局删除而不是默认库中的删除。我尝试制作另一个编译 DLL 的纯本机项目,并将我所有的静态库编译到其中,然后让互操作层加载该 DLL。这可行,但我宁愿不用两层胶水而不是一层。

我正在使用 Visual Studio 2015。

【问题讨论】:

内存跟踪很好,但不会重载全局 new 并删除一个普通的 hack? 【参考方案1】:

本机组件使用 CRT 作为 DLL?如果使用混合组件,这是必需的。如果您的静态链接库使用静态 CRT,您会遇到麻烦。

检查并链接 /VERBOSE 标志以查看其他删除的来源。消除这个其他库调用。

【讨论】:

以上是关于全局删除冲突重载的主要内容,如果未能解决你的问题,请参考以下文章

MinGW 中的全局重载运算符 new/delete

04. 命名空间,函数重载,内联

04. 命名空间,函数重载,内联

29.局部和全局重载new delete

C ++全局重载运算符= [重复]

C++学习27 用全局函数重载运算符