StupidBeauty
Read times:1127Posted at:Thu Nov 7 00:02:13 2013
- no title specified

MinGW文档翻译:如何使用MinGW 来为一个动态链接库创建一个导入库,HOWTO Create an Import Library for a DLL using MinGW

这篇文章说的是,如何在妳的mingw 程序中“调用”一个已有的动态链接库。要想研究如何创建妳自己的动态链接库的话,就参考 动态链接库

通常(注意,这里意思是说:对于所有由MinGW 创建的动态链接库,及部分由其它工具创建的动态链接库,这话是成立的)MinGW可以直接与一个动态链接库链接起来。无需借助于特殊的导入库(参考 简单动态链接库 )。

然而,某些情况下,链接会失败。这种情况下,妳就需要一个所谓的导入库来帮助链接器工作。这篇文章里剩下的内容说的就是,当妳只有一个动态链接库文件的时候,如何创建这样一个导入库。

MinGW带有一个便捷的工具,它会为妳做好大部分工作:

dlltool.exe(或者,在 linux 的交叉编译环境中,是i586-mingw32-dlltool 或类似的东西)。执行'dlltool --help'就可以看到这个工具的一些选项说明

某些情况下 dlltool可以直接从一个动态链接库文件中产生出一个导入库。但是呢,这种情况下妳实际上也用不着这个导入库,因为链接器在这种情况下也不需要导入库的帮助。所以呢,当妳会找到这篇文章的时候,就意味着妳手上现在有一个无法被MinGW 直接链接进去的动态链接库了。妳可以通过创建一个def 文件来帮助链接器完成它的工作。要创建这个文件,有多种手段。以下说明其中的几种:

执行'dlltool -z somedll.def --export-all-symbol somedll.dll' (注意在执行命令时不要两边的单引号)

妳极有可能会看到这样的输出'dlltool: somedll.dll: no symbols'。但是,妳可以从这个步骤中创建的def文件着手开始工作,而且妳可能只需要做少量的额外调整工作就可以了。

使用妳最喜欢的文本编辑器来创建一个文件somedll.def,写上这些内容:

LIBRARY SOMEDLL.DLL
EXPORT
<外部(external)符号名,每行一个>

这里<外部(external)符号名,每行一个>中至少要包含那些被链接器报告说不存在但是妳认为就存在于这个somedll.dll 里的外部引用。这个列表中,每行只写一个符号名字。
当妳创建好了def 文件(参考上面的说明)之后,执行

dlltool -d somedll.def -l libsomedll.a

取决于这个动态链接库文件本身的特点,妳可能还需要尝试一下以下选项:

加上选项-U

这会在导入库中的所有符号名之前加上一个下划线'_'

加上选项-k

这会删除导出的符号名中的@<n>,但是它们的调用方式还是保持为stdcall。

加上选项-A

这个选项,会给所有的stdcall 条目加上一个别名,但是不带@<n>。也就是说,会同时导出未修饰的符号名(就是-k选项的效果)和修饰过的符号名。

关于dlltool 及这些选项的详细说明,请去参考对应的文档。

完事了。这样所产生的libsomedll.a 文件应该就能够帮助链接器正常工作了。

示例

一个由Delphi创建的外部库的def文件

LIBRARY Diverg01.dll

EXPORTS

Divergences

LTDivergences

STDivergences

针对IBM 的db2cli.dll的def 文件的一部分

LIBRARY DB2CLI.dll

EXPORTS

SQLAllocConnect@8

SQLAllocEnv@4

SQLAllocHandle@12

SQLAllocStmt@8

SQLBindCol@24

SQLBindFileToCol@32

SQLBindFileToParam@32

SQLBindParam@32

SQLBindParameter@40

SQLBrowseConnect@24

SQLBrowseConnectW@24

SQLBuildDataLink@40

SQLBulkOperations@8

...

注意,妳还可以使用pexports 命令来完成以上工作(参考 常见问题 中的Python 示例)。

注意,某些动态链接库就是 不兼容 ——比如说,不同编译器中 long long 的尺寸不一样,而妳正好需要使用含有long long这种类型的结构体的时候,就有麻烦了。已知,微软的VC中,对于long double 类型的尺寸,就与gcc 不一样,某些版本中 size_t 的尺寸也不一样(可能还会有其它的一些差异)。

罗海琼

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands