error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMT.lib(new.obj)链接错误!

本文介绍了解决在非MFC程序中添加MFC支持时遇到的CRT和MFC库链接顺序错误的问题。通过调整链接顺序并排除特定库,最终解决了错误LNK2005和警告LNK4098。

环境:在非MFC程序(使用standard windows library)中,添加MFC支持,静态链接MFC库。

  发生以下错误:

uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMT.lib(new.obj)
uafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMT.lib(delete.obj)
uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in LIBCMT.lib(new2.obj)

  问题产生原因,CRT库和MFC库链接时顺序有误:

The CRT libraries use weak external linkage for the new, delete, and DllMain functions. The MFC libraries also contain new,   delete, and DllMain functions. These functions require the MFC libraries to be linked before the CRT library is linked.

  具体解决方法:(另一种解决方法参见最后链接,本人未测试)

  在vs2005项目设置中【Linker】-【input】-【additional dependencies】追击nafxcw.lib,libcmt.lib,Debug下,追加Nafxcwd.lib,libcmtd.lib。

  再次编译通过,但出现

  LINK : warning LNK4098: defaultlib 'uafxcw.lib' conflicts with use of other libs; use /NODEFAULTLIB:library

  在【Linker】-【input】-【Ignore specific library】中追加uafxcw.lib。

`error LNK2005` 错误通常是由于函数或变量的重复定义导致的。在编译过程中,编译器将各个 `.cpp` 文件分别编译成目标文件(`.obj`),链接器在链接这些目标文件时发现了重复的定义,就会报 `LNK2005` 错误。对于 `error LNK2005: "void __cdecl del(void)" (?del@@YAXXZ) 已经在 del.obj 中定义` 错误,可以尝试以下解决方法: ### 1. 检查函数定义是否重复 确保 `del` 函数没有在多个 `.cpp` 文件中重复定义。根据引用[2],对于一个函数来说,声明可以多次,但定义只能一次。如果在多个 `.cpp` 文件中都定义了 `del` 函数,需要将多余的定义删除,只保留一处定义。 例如,在 `main.cpp` 和 `del.cpp` 中都定义了 `del` 函数: ```cpp // main.cpp #include <iostream> void del() { std::cout << "Deleting..." << std::endl; } int main() { del(); return 0; } // del.cpp #include <iostream> void del() { std::cout << "Deleting..." << std::endl; } ``` 需要将其中一个文件中的 `del` 函数定义删除,只保留一处。可以将 `del.cpp` 中的 `del` 函数定义删除,然后在 `main.cpp` 中包含 `del.cpp` 的声明: ```cpp // main.cpp #include <iostream> // 声明 del 函数 void del(); int main() { del(); return 0; } // del.cpp #include <iostream> void del() { std::cout << "Deleting..." << std::endl; } ``` ### 2. 使用头文件和 `#pragma once` 或 `#ifndef` 保护 如果 `del` 函数的声明在头文件中,确保头文件使用了 `#pragma once` 或 `#ifndef` 保护,以防止头文件被重复包含。 使用 `#pragma once`: ```cpp // del.h #pragma once #include <iostream> void del(); // del.cpp #include "del.h" void del() { std::cout << "Deleting..." << std::endl; } // main.cpp #include "del.h" int main() { del(); return 0; } ``` 使用 `#ifndef`: ```cpp // del.h #ifndef DEL_H #define DEL_H #include <iostream> void del(); #endif // del.cpp #include "del.h" void del() { std::cout << "Deleting..." << std::endl; } // main.cpp #include "del.h" int main() { del(); return 0; } ``` ### 3. 检查库文件冲突 有时候,重复定义的错误可能是由于库文件冲突引起的。确保没有重复链接相同的库文件,或者检查是否有库文件中定义了与 `del` 函数同名的函数。根据引用[1],CString 在 DLL 中使用时可能会出现类似的库文件冲突问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值