全局删除冲突重载
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 标志以查看其他删除的来源。消除这个其他库调用。
【讨论】:
以上是关于全局删除冲突重载的主要内容,如果未能解决你的问题,请参考以下文章