Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5773617
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: C/C++

2006-11-11 21:41:32

在 Visual C++ 中以错误的顺序链接 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 库。

回到顶端

解决方案

该问题有两种解决方法。第一种方法是强制链接器按照正确的顺序链接库。第二种方法是由您亲自查找导致问题的模块并纠正它。

注意:下列步骤基于 Visual C++ 6.0 进行。
回到顶端

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

1.在“项目”菜单上,单击“设置”。
2.在“项目设置”对话框的“以下项目的设置”视图中,单击以选中出现链接错误的项目配置。
3.在“链接”选项卡上,单击以选中“类别”组合框中的“输入”。
4.在“忽略库”框中,插入库名(例如,Nafxcwd.lib;Libcmtd.lib)。

注意:等效的链接器命令行是:/NOD:
5.在“对象/库模块”框中,插入库名。必须确保这些库按顺序列出,而且是行中的前两个库(例如,Nafxcwd.lib 和 Libcmtd.lib)。
要在 Visual C++ .NET 中设置该选项,请阅读“设置 Visual C++ 项目属性”联机帮助主题。
回到顶端

解决方案二:找到并纠正出现问题的模块

要查看当前的库链接顺序,请按照下列步骤操作:
1.在“项目”菜单上,单击“设置”。
2.在“项目设置”对话框的“以下项目的设置”视图中,单击以选中出现链接错误的项目配置。
3.在“链接”选项卡上的“项目选项”框中键入 /verbose:lib
4.重新生成项目。在链接过程中,这些库将在输出窗口中列出。
阅读(2009) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~