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 错误之一:
这是因为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