×
Namespaces

Variants
Actions

如何生成导入库(.lib)

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

文章
翻译:
hoolee
最后由 hamishwillee 在 22 Dec 2011 编辑
  • 详细描述

导入库(.lib)的生成依赖于两个东西:

  1. mmp工程文件中的EXPORTUNFROZEN命令行
  2. .DEF文件

Contents

关于EXPORTUNFROZEN

当我们仍在开发阶段时,需要在mmp文件中设置EXPORTUNFROZEN命令,因为这时我们经常需要调整DLL接口,直到发布DLL前,我们仍需要强制指明EXPORTUNFROZEN,当EXPORTUNFROZEN命令使用时,导入库在链接过程中生成。


什么是.Def文件

.Def是模块定义文件,他提供了导出函数的信息,他们属性以及序列位置。


为何.Def如何重要

  • .Def是保重二进制兼容的重要因素
  • 使用你dll的代码将被链到指定的序列位置(所谓的序列位置就是你DEF文件中各导出函数的标识或数字),要确保序列位置一致,这样才能保证调用你DLL的程序能正常工作,而不至于产生二进制兼容
  • 因此使用.Def文件时,我们要管理序列位置,这样新增加的导出函数就增加到最后,以便原有函数维持二进制兼容,这样程序和老的一样可以使用新的DLL。

如何生成.Def文件

命令行 编译你想要生成的平台,然后使用abld freeze命令生成.DEF文件,当无法找到.DEF文件来freeze时,你将会获得"File not found - OK if freezing for first time"的警告消息。

Carbide 在Project>>Freeze Exports

.DEF文件应放哪里

  • 缺省时,编译工具会为模拟器的DEF文件生成BWINS目录,ARM格式def文件则生成在EABI目录中,都在包含mmp文件的目录下
  • 如果文件存放上上述缺省目录,那么mmp文件不需要特别指明DEF文件的位置
  • mmp文件应该使用deffile关键字来指明位置,如果你存放位置是上述目录
  • 现在我们可以为不同的平台指明不同的DEF文件,你可以选择#if定义正确的def文件,平台选择如下:
#if defined(WINS)
deffile ..\winsfolder\SAMPLE_WINS.DEF
#else
deffile ..\otherfolder\SAMPLE_EABI.DEF
#endif

当我们同时拥有EXPORTUNFROZEN和.DEF文件时会发生什么

如果你在mmp文件中定义了EXPORTUNFROZEN,那么导入库(lib和dso)将作为编译部分也同时生成

如何使用Def文件生成导入库

编译你的dll,如果不再需要EXPORTUNFROZEN,那它将不会生成直接生成lib(dso)文件,首先要使用abld freeze命令行,它将生成Def文件,然后生成makefile(如bldmake bldfiles)那么它将从frozen .DEF文件生成导入库。

参考

This page was last modified on 22 December 2011, at 07:44.
63 page views in the last 30 days.