Symbian 之 DEF 与 Dll 构建
2010-04-01 05:05:00 来源:WEB开发网Symbian中dll必须有一个同名的lib(导入库),才能使得其他程序使用dll中的方法。
在一个项目的mmp中通过LIBRARY行,实现了程序和lib的静态链接。程序运行时根据LIB中的信息,才能找到dll中正确的代码段,执行这段代码。
LIB是根据DEF文件生成的,所以DEF文件是生成lib文件的依据。
通过命令abld freeze启动接口冻结时,会生成DEF文件。DEF中的信息来源于Dll,记录了Dll中被导出的函数的信息。在编译Dll时,每个导出函数都被分配了一个唯一序号,记录在DEF中,这些信息会被送进lib中,用于运行时找到dll中的函数。、
所以依赖关系是这样的
依赖 <-------------------------------------------
DLL <--- DEF <--- LIB <--- 外部使用DLL
完成的Dll生成步骤为
1. 在mmp中定义生成的def文件的位置和名称
#if defined(WINS)
deffile .TestDllwinscw.def
#else if defined(ARM)
deffile .TestDllARM.def
#endif
不是必须的,如果没有,def默认的文件名为
2. 编译生成Dll
abld build winscw udeb
3. 启动冻结接口,生成def
abld freeze winscw udeb
4. 再次编译Dll,此时因为def已经存在,生成dll,同时根据def生成lib
启动冻结接口,生成DEF后,再次编译Dll时,导出函数接口上的变化不会更新到DEF中,因为DEF认为冻结后的接口不会再变。所以导出函数的接口发生变化时,需要重新生成lib,那么就要解冻接口。
解冻接口的办法比较傻瓜,就是直接把def删了。再按照上述步骤重新编译一遍。
如果Dll已经发布,正在被应用程序使用,这样更新Dll和lib会使你挨一顿骂。因为重新生成DEF,可能会使原先被分配给每个函数的序号发生变化,对于依赖于之前版本的应用程序将无法运行。对于这个,我也只有笨办法,将原来的def备份,然后生成新的def,自己将变化的信息合到原来的def中,保持原来的序号不变,对于新增加的函数,自己给一个序号,也只有这样了。
更多精彩
赞助商链接