"void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in coredll.lib(COREDLL.dl

使用EVC4.0(SP4)编译程序出现特定错误时,可通过以下方法解决:一是在Project->Settings对话框的link选项卡Project Options框内加入“/verbose:lib”;二是在Objects/library modules框中输入uafxwced.lib并放最前;三是去掉commctrl.lib coredll.lib。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当使用EVC4.0(SP4)编译程序,出现如下类似错误时:"void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in coredll.lib(COREDLL.dll)

 可以采用以下方法解决:

1. 打开Project->Settings对话框,在link选项卡的Project Options框内加入: "/verbose:lib"。

2. 在project->settings->link的Objects/library modules框中输入uafxwced.lib。问题解决。 注意:要把uafxwced.lib放到其它库文件名的最前面。

3.我试过可以在project->settings->link的Objects/library modules框中去掉commctrl.lib coredll.lib

<think>嗯,用户遇到了链接错误,具体是未解析的外部符号'operator delete'在DetourAttachEx函数中引用的错误。我需要仔细分析可能的原因。首先,DetourAttachEx可能是微软的Detours库中的函数,所以这可能与C++运行时库的链接有关。 用户的问题是关于链接器错误LNK2001或LNK2019,提示找不到operator delete的实现。通常,这种错误发生在代码中使用了某个函数或操作符,但链接器找不到对应的实现。operator delete是C++中用于释放内存的操作符,属于标准库的一部分。如果链接时没有正确链接到相应的运行时库,就会出现这个问题。 首先,我应该考虑运行时库的兼容性。Detours库可能需要使用特定版本的运行时库,比如MT(静态链接)或MD(动态链接)。如果项目设置中的运行时库选项与Detours库的编译选项不匹配,就会导致链接错误。比如,用户的项目可能使用了/MD(多线程DLL),而Detours库是用/MT(多线程静态)编译的,或者相反。这种情况下,需要统一两者的运行时库设置。 接下来,C++标准库的版本也是一个可能的原因。如果用户使用的编译器版本与Detours库编译时使用的版本不一致,可能会导致符号不兼容。比如,使用VS2019编译的库在VS2022项目中可能会出现这种问题。需要确认两者的编译器版本是否匹配。 另外,代码中的内存管理不一致也可能引发问题。如果项目中混合了不同的内存分配和释放方式,比如在某些地方使用new/delete,而在其他地方使用malloc/free,可能会导致operator delete找不到正确的实现。需要检查代码中是否存在这样的不一致情况。 还有可能是Detours库的配置问题。用户是否正确包含了Detours的库文件(.lib)?在项目属性中是否添加了正确的附加库目录?需要确保链接器能够找到Detours.lib及其依赖项。 此外,头文件的包含是否正确?可能存在函数声明与实现不一致的情况,比如参数类型或调用约定不匹配。需要检查DetourAttachEx的函数声明是否正确,是否使用了正确的调用约定(如__stdcall或__cdecl)。 用户可能需要检查以下几个方面: 1. 项目属性中的C/C++ -> 代码生成 -> 运行时库设置是否与Detours库一致。 2. 确保使用的编译器版本与Detours库兼容。 3. 正确链接Detours.lib和其他必要的库文件。 4. 检查代码中是否存在内存管理的不一致。 5. 确保所有函数声明与库中的实现一致,特别是调用约定和参数类型。 此外,可能需要参考微软的官方文档或Detours库的文档,确认是否有特殊的配置要求。例如,Detours可能需要特定的预处理宏定义,或者在链接时需要特定的顺序。 如果用户已经确认了运行时库的设置和编译器版本,但问题仍然存在,可能需要重新编译Detours库,使其与当前项目的设置一致。例如,使用相同的运行时库选项重新生成Detours的静态库。 另外,检查是否有其他库或代码模块可能覆盖了operator delete的实现,导致冲突。某些第三方库可能会替换全局的new和delete操作符,从而引发链接问题。 最后,建议用户提供更多的错误上下文,比如完整的错误信息、项目配置详情、使用的编译器和Detours版本,以便更准确地诊断问题。</think>### 链接错误解决方案:未解析的外部符号 "operator delete" 与 DetourAttachEx 函数 #### 1. 检查运行时库兼容性 此错误通常与 **C++运行时库(CRT)的链接方式** 不匹配有关。DetourAttachEx 属于 Microsoft Detours 库函数,需确保项目与 Detours 库使用相同的运行时库配置: - 在 Visual Studio 中右击项目 > **属性 > C/C++ > 代码生成 > 运行库**: - **多线程调试 (/MTd)**(静态链接调试版) - **多线程 (/MT)**(静态链接发布版) - **多线程调试 DLL (/MDd)**(动态链接调试版) - **多线程 DLL (/MD)**(动态链接发布版) 若 Detours 库使用 `/MT` 编译,则项目必须选择相同选项[^1][^2]。 #### 2. 验证 C++ 标准库版本 编译器版本不兼容会导致符号解析失败: - 确认 **Detours 库的编译环境**(如 VS2019/VS2022)与当前项目一致 - 若使用预编译的 Detours 库,尝试 **重新编译 Detours 源码** 以匹配当前环境 #### 3. 检查内存管理一致性 若代码中混合了不同内存管理方式(例如:Detours 使用 `new/delete` 而项目使用自定义内存分配器),需统一管理方式: ```cpp // 示例:全局重载 delete 运算符(需与库实现匹配) void operator delete(void* ptr, size_t size) noexcept { // 自定义实现或调用标准库 free(ptr); } ``` #### 4. 确认 Detours 库配置 - 在 **链接器 > 输入 > 附加依赖项** 中添加 `detours.lib` - 确保 **链接器 > 常规 > 附加库目录** 包含 Detours 库路径 - 若使用 64 位编译,需确认 Detours 支持 x64 架构[^3] #### 5. 验证函数签名匹配 DetourAttachEx 的函数声明需与库实现严格一致: ```cpp // 正确声明示例(来自 detours.h) LONG WINAPI DetourAttachEx(_Inout_ PVOID* ppPointer, _In_ PVOID pDetour, _Out_opt_ PDETOUR_TRAMPOLINE* ppRealTrampoline, _Out_opt_ PVOID* ppTarget, _Out_opt_ PVOID* ppRealTarget); ``` 若参数类型或调用约定(如 `WINAPI`)不匹配,会导致链接器无法解析符号。 #### 典型配置对比表 | 配置项 | 项目设置 | Detours 库要求 | |----------------|-------------------|-------------------| | 运行时库 | /MT 或 /MD | 必须一致 | | 平台工具集 | VS2019 (v142) | 建议一致 | | 目标架构 | x86/x64 | 必须一致 | | 异常处理 | /EHsc | 建议启用 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值