链接:.a,.lib和.def文件

Nor*_*wap 29 windows dll loader

我正在使用GNU binutils在Windows上使用程序集构建一个dll.

我知道可以在加载可执行文件时或在运行时加载dll(使用LoadLibrary api调用).

对于加载时加载,我似乎只需要dll文件:不需要.a,.lib或.def文件.我想知道这些文件格式代表什么,它们的用途是什么.

我所知道的和一些具体问题:

  • .a是Unix上通常用于静态库的扩展..a文件是使用GNU ld 的--out-implib选项生成的.它被认为是一个"进口图书馆",足够公平.问题是"如果我在链接时不需要它,那对我来说有什么用?"

  • .lib是Windows上用于静态库的扩展,根据维基百科,在windows下也被用作"导入库",所以我强烈怀疑它们只是binutils调用.a文件的另一个名称.真假 ?

  • 我可以找到的所有页面都指出.def文件列出了dll的导出符号.这与"导入库"应该做的有点类似吗?

  • 另外,我在这里读到使用.def文件是在源文件中手动指定导出的替代方法(我做过).但我还记得读取(找不到引用).def文件为导出的符号提供索引(序号),允许更快的运行时加载.是这样吗 ?

Lum*_*umi 54

Linux上的静态库具有.a文件扩展名.Windows上的静态库具有.lib文件扩展名.Windows上的动态库具有.dll扩展名; 为了链接DLL,需要导入库.导入库是一个静态库.它包含加载DLL所需的代码.现在你正在使用GCC(而不是cl.exe)在Windows上编译.GCC对导入库有另一个文件扩展名约定,它"应该被称为*.dll.a或*.a",正如你所提到的文档中--out-implib所解释的那样.

导入库(.lib使用MSVC或.dll.aGCC)静态库:它们包含加载DLL的代码.前几天我有同样的问题.

DLL可能具有导出的功能和未导出的功能.导入库必须知道哪些函数是导出的,哪些不是.告诉它的一种方法是DEF文件.

构建DLL时,链接器使用.def文件创建导出(.exp)文件和导入库(.lib)文件.然后,链接器使用导出文件来构建DLL文件.构建时隐式链接到导入库的DLL链接的可执行文件.- MSDN:使用DEF文件从DLL导出

另请参阅MSDN:按顺序而不是按名称从DLL导出函数,这些应该按索引或序号回答您关于导出的最后一个问题.

  • 好样品!+1找到你问题的答案."[ld的cygwin/mingw端口支持**直接链接**,包括数据符号,**到dll而不使用任何导入库**.](http://sources.redhat.com/binutils /docs-2.21/ld/WIN32.html)...直接链接到一个DLL不使用除"-L"和"-l"之外的额外命令行开关,因为ld已经搜索了许多名称以匹配每个库... ...鉴于速度和内存使用方面的改进,人们可能有理由怀疑为什么要使用导入库.有三个原因......"至少从2002年开始支持! (7认同)
  • @Norswap 该链接似乎已失效 (2认同)