ce 6.0 链接错误

今天在CE 6.0中添加了一个驱动,在buid我的驱动的时候,显示有链接错误。是我驱动中调用FSDMGR_AdvertiseInterface,等几个fsdmgr中的函数,链接有问题。由于以前在网上看到的资料,说产生链接错误,很有可能是环境配置有问题。基于此,我换了个机器,重新配置环境,结果错误照常产生。后来请教了一位大侠,大侠提醒,很有可能是链接的lib有问题。在大侠的帮助下,进行了一下尝试:
一、驱动的sources文件中调用的是coredll.lib,怀疑ce6.0中的lib分为用户(coredll.lib)和内核(k.coredll.lib),所以将coredll.lib换成了k.coredll.lib,结果依然不行。
二、既然调用的是fsdmgr中的函数,我将fsdmgr的dll链接过来,应该就可以了吧。打开fsdmgr的sources文件,看到其 TARGETNAME 为 fsdmgr_lib,搜索到 fsdmgr_lib.lib 的位置,在自己驱动的sources文件中添加对该lib的链接。结果,fsdmgr_lib.lib 中有一堆错误产生。
三、此时想到了帮助文档,在帮助文档中搜FSDMGR_AdvertiseInterface,显示
Requirements
Header
fsdmgr.h
Library
Fsdmgr.lib
Windows Embedded CE
Windows CE 2.10 and later
头文件已经完成了包含,就在驱动的sources文件中添加了对fsdmgr.lib的链接。当然,首先要在自己的环境中找到fsdmgr.lib的位置。此时,再去build驱动,一切OK。
 
看来帮助文档是王道,遇到问题,只凭猜测是不行的。

在连接fsdmgr_lib.lib的时候,显示的错误如下:
BUILD: [01:0000000105:ERRORE] fsdmgr_lib.lib(fsdmain.obj) : error LNK2005: _DllMain already defined in JFS_Main.obj
BUILD: [01:0000000106:ERRORE] fsdmgr_lib.lib(mountedvolume.obj) : error LNK2019: unresolved external symbol _NotifyCreateFile referenced in function "public: void * __cdecl MountedVolume_t::NotifyCreateFile(unsigned short const *)" (?NotifyCreateFile@MountedVolume_t@@QAAPAXPBG@Z)
BUILD: [01:0000000107:ERRORE] fsdmgr_lib.lib(mountedvolume.obj) : error LNK2019: unresolved external symbol _NotifyCreateVolume referenced in function "public: long __cdecl MountedVolume_t::Attach(void)" (?Attach@MountedVolume_t@@QAAJXZ)
BUILD: [01:0000000108:ERRORE] fsdmgr_lib.lib(mountedvolume.obj) : error LNK2019: unresolved external symbol _NotifyDeleteVolume referenced in function "protected: void __cdecl MountedVolume_t::Destroy(void)" (?Destroy@MountedVolume_t@@IAAXXZ)
BUILD: [01:0000000109:ERRORE] fsdmgr_lib.lib(volumeapi.obj) : error LNK2019: unresolved external symbol _NotifyPathChange referenced in function "public: void __cdecl MountedVolume_t::NotifyPathChange(unsigned short const *,int,unsigned long)" (?NotifyPathChange@MountedVolume_t@@QAAXPBGHK@Z)
BUILD: [01:0000000110:ERRORE] fsdmgr_lib.lib(mounttable.obj) : error LNK2001: unresolved external symbol _NotifyPathChange
BUILD: [01:0000000111:ERRORE] fsdmgr_lib.lib(volumeapi.obj) : error LNK2019: unresolved external symbol _NotifyMoveFile referenced in function "public: void __cdecl MountedVolume_t::NotifyMoveFile(unsigned short const *,unsigned short const *)" (?NotifyMoveFile@MountedVolume_t@@QAAXPBG0@Z)
BUILD: [01:0000000112:ERRORE] fsdmgr_lib.lib(volumeapi.obj) : error LNK2019: unresolved external symbol _NotifyMoveFileEx referenced in function "public: void __cdecl MountedVolume_t::NotifyMoveFileEx(unsigned short const *,unsigned short const *,int)" (?NotifyMoveFileEx@MountedVolume_t@@QAAXPBG0H@Z)
BUILD: [01:0000000113:ERRORE] fsdmgr_lib.lib(volumeapi.obj) : error LNK2019: unresolved external symbol _NotifyCreateEvent referenced in function "public: void * __cdecl MountedVolume_t::NotifyCreateEvent(void *,unsigned short const *,int,unsigned long)" (?NotifyCreateEvent@MountedVolume_t@@QAAPAXPAXPBGHK@Z)
BUILD: [01:0000000114:ERRORE] fsdmgr_lib.lib(fileapi.obj) : error LNK2019: unresolved external symbol _NotifyCloseHandle referenced in function "public: void __cdecl MountedVolume_t::NotifyCloseHandle(void *)" (?NotifyCloseHandle@MountedVolume_t@@QAAXPAX@Z)
BUILD: [01:0000000115:ERRORE] fsdmgr_lib.lib(fileapi.obj) : error LNK2019: unresolved external symbol _NotifyHandleChange referenced in function "public: void __cdecl MountedVolume_t::NotifyHandleChange(void *,unsigned long)" (?NotifyHandleChange@MountedVolume_t@@QAAXPAXK@Z)
BUILD: [01:0000000116:ERRORE] fsdmgr_lib.lib(pathapi.obj) : error LNK2019: unresolved external symbol _NotifyGetNextChange referenced in function _FSEXT_FindNextChangeNotification
BUILD: [01:0000000117:ERRORE] fsdmgr_lib.lib(pathapi.obj) : error LNK2019: unresolved external symbol _INT_NotifyGetNextChange referenced in function _FSINT_FindNextChangeNotification
BUILD: [01:0000000118:ERRORE] fsdmgr_lib.lib(pathapi.obj) : error LNK2019: unresolved external symbol _NotifyCloseChangeHandle referenced in function _FSEXT_FindCloseChangeNotification
BUILD: [01:0000000119:ERRORE] fsdmgr_lib.lib(pathapi.obj) : error LNK2019: unresolved external symbol _INT_NotifyCloseChangeHandle referenced in function _FSINT_FindCloseChangeNotification
BUILD: [01:0000000120:ERRORE] C:/WINCE600/platform/NaviCoreJ3Eval/target/SH4/retail/JacintoFSD.dll : fatal error LNK1120: 13 unresolved externals
 
第一个错误显示了DllMain重复定义。用记事本打开fsdmgr_lib.lib文件,在其中可以找到DllMain的信息。然后打开fsdmgr.lib文件,在里面找不到DllMain的信息。
 
查了些资料,发现是自己对动态链接库和静态链接库的理解不到位。
.lib文件有两种:
一种是静态链接库。这种情况下,.lib文件不过是将需要的.obj文件进行了一个打包,并在相应的头文件中对其中的函数进行声明。在链接的时候,会将静态库的整个内容,包含到你的程序生成的EXE文件中。如果静态库中也定义了DLLMain函数,该静态库就不能被其他动态库(含有DLLMain函数)链接,否则会出现DLLMain重复定义的错误。需要说明的是,静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
另一种.lib文件是动态链接库的导入库(Import Libraries)。使用导入库,并include了动态库的头文件,就可以直接使用头文件中声明的函数,而不需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。
 
此处之所以链接fsdmgr.lib正常,而链接fsdmgr_lib.lib时出错,是因为fsdmgr_lib.lib是静态库,里面包含了DLLMain函数,以及其他函数的实现,所以会显示DLLMain重复定义,函数实现中使用到的一些接口,在自己的驱动中也是找不到的,所以出现了很多错误。而fsdmgr.lib是动态链接库fsdmgr.dll的导入库,所以,在驱动中链接该库一切OK。
 
呵呵,顺便恶补了一下动态库与静态库的知识。
posted @ 2010-06-15 10:01  andriod2012  阅读(342)  评论(0编辑  收藏  举报