error LNK2005编译错误 EVC

    error LNK2005错误有很多种,有些跟.h头文件引用顺序有关,有些与lib库的引用顺序有关,难以捉摸。最近在做fbreader移植到wince系统就遇到了这两种情况,故而记之。

 

问题现象一:重复定义,错误提示如下

头文件顺序

#include "ZLFile.h"
#include "ZLZDecompressor.h"
#include "PalmDocStream.h"
#include "DocDecompressor.h"
#include "HuffDecompressor.h"

 

编译产生的错误提示:

PalmDocStream.obj : error LNK2005: GetDllVersion already defined in EReaderStream.obj
PalmDocStream.obj : error LNK2005: IsDlgButtonChecked already defined in EReaderStream.obj
PalmDocStream.obj : error LNK2005: CheckDlgButton already defined in EReaderStream.obj
PalmDocStream.obj : warning LNK4006: GetDllVersion already defined in EReaderStream.obj; second definition ignored
PalmDocStream.obj : warning LNK4006: IsDlgButtonChecked already defined in EReaderStream.obj; second definition ignored
PalmDocStream.obj : warning LNK4006: CheckDlgButton already defined in EReaderStream.obj; second definition ignored

   上面的错误真是莫,不知道哪里调用了这些函数。。。。

  解决办法:将#include "ZLZDecompressor.h"放在最后面,问题解决

#include "ZLFile.h"
#include "PalmDocStream.h"
#include "DocDecompressor.h"
#include "HuffDecompressor.h"

#include "ZLZDecompressor.h"

问题现象二、下面有现象是我以前在将程序从wince5.0 到WINCE6.0时出现的,因为CE5.0采用MFC动态DLL,而CE6.0只能采用STATIC MFC LIB库。

当 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) :
 
 
原因:CRT 库对 newdeleteDllMain 函数使用弱外部链接。MFC 库也包含 newdeleteDllMain 函数。这些函数要求先链接 MFC 库,然后再链接 CRT 库。
 
改善办法:
2. 将MFC静态链接改为动态链接
3.在wince6.0下无法支持MFC动态链接(模拟器除外),不知道微软件搞什么,反正在设备板上就是无法运行带动态MFC链接的应用程序;
http://blogs.msdn.com/mikehall/archive/2005/12/01/498999.aspx    这个解释了微软件为什么默认不采用(use MFC in a shared DLL)有兴趣的可以参考一下。
 
uafxwce.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in coredll.lib(COREDLL.dll)

  这是因为MFC库先于其它库被链接,通过以下办法改变LIB 库的调用顺序,可解决该问题:

Project -> Settings -> Link ->Catergory(Input)  

In Ignore Libraries

Add "uafxwce.lib coredll.lib

In the Object/Libraries modules

Add "uafxwce.lib coredll.lib" in the order that is mentioned 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值