WEB开发网
开发学院手机开发Symbian 开发 Symbian 之 DEF 与 Dll 构建 阅读

Symbian 之 DEF 与 Dll 构建

 2010-04-01 05:05:00 来源:WEB开发网   
核心提示:Symbian中dll必须有一个同名的lib(导入库),才能使得其他程序使用dll中的方法,Symbian 之 DEF 与 Dll 构建,在一个项目的mmp中通过LIBRARY行,实现了程序和lib的静态链接,对于新增加的函数,自己给一个序号,程序运行时根据LIB中的信息,才能找到dll中正确的代码段

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默认的文件名为U.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中,保持原来的序号不变,对于新增加的函数,自己给一个序号,也只有这样了。

Tags:Symbian DEF Dll

编辑录入:coldstar [复制链接] [打 印]
赞助商链接