CRT和MFC库的冲突--lnk2005错误

症状:

当 C 运行时 (CRT) 库和 Microsoft 基础类 (MFC) 库的链接顺序有误时,可能会出现以下 LNK2005 错误之一:

nafxcwd.lib(afxmem.obj) :error LNK2005:
"void * __cdecl operator new(unsigned int)"(??2@YAPAXI@Z) already
defined in LIBCMTD.lib(new.obj)
nafxcwd.lib(afxmem.obj) :error LNK2005:
"void __cdecl operator delete(void *)"(??3@YAXPAX@Z) already defined
in LIBCMTD.lib(dbgnew.obj)
nafxcwd.lib(afxmem.obj) :error LNK2005:
"void * __cdecl operator new(unsigned int,int,char const *,int)"
(??2@YAPAXIHPBDH@Z) already defined in LIBCMTD.lib(dbgnew.obj)
mfcs40d.lib(dllmodul.obj):error LNK2005:_DllMain@12 already defined in
MSVCRTD.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj):error LNK2005:_DllMain@12 already defined in
msvcrtd.lib(dllmain.obj)
原因:
CRT 库对 newdeleteDllMain 函数使用弱外部链接。MFC 库也包含 newdeleteDllMain 函数。这些函数要求先链接 MFC 库,然后再链接 CRT 库。
该问题有两种解决方法。第一种方法是强制链接器按照正确的顺序链接库。第二种方法是由您亲自查找导致问题的模块并纠正它。

解决方案一:强制链接器按照正确的顺序链接库

  1. 右键工程-》属性-》linker->Input->Ignore Specific Liabary   填写Nafxcwd.lib;Libcmtd.lib
  2. 在 linker->Input->Additional Dependencies    填写Nafxcwd.lib Libcmtd.lib

原理:该方法通过先忽略掉Nafxcwd.lib;Libcmtd.lib(因为这两个库是IDE的默认库) 然后再强制连接器按照正确的顺序链接库;

 

 

我的解决方案:

      我的问题也是 new, delete already defined;  我们游戏引擎自定义了new, delete等操作,恰好VC2008 Feather Pack

也自定义了这两个操作。也就出现了这个lnk 2005问题;

      我研究了半天, 无法强制两者的链接顺序,     不过把 工程属性-》General   | Use of MFC   调成Use MFC in a Shared DLL 就没有问题了。   (我原来是用的Use MFC in a Static Library)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值