DEF与Dll构建

来源:百度文库 编辑:神马文学网 时间:2024/04/25 17:55:54
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.def2. 编译生成Dll    abld build winscw udeb3. 启动冻结接口,生成def    abld freeze winscw udeb4. 再次编译Dll,此时因为def已经存在,生成dll,同时根据def生成lib      启动冻结接口,生成DEF后,再次编译Dll时,导出函数接口上的变化不会更新到DEF中,因为DEF认为冻结后的接口不会再变。所以导出函数的接口发生变化时,需要重新生成lib,那么就要解冻接口。     解冻接口的办法比较傻瓜,就是直接把def删了。再按照上述步骤重新编译一遍。     如果Dll已经发布,正在被应用程序使用,这样更新Dll和lib会使你挨一顿骂。因为重新生成DEF,可能会使原先被分配给每个函数的序号发生变化,对于依赖于之前版本的应用程序将无法运行。对于这个,我也只有笨办法,将原来的def备份,然后生成新的def,自己将变化的信息合到原来的def中,保持原来的序号不变,对于新增加的函数,自己给一个序号,也只有这样了。