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导出函数,这些应该按索引或序号回答您关于导出的最后一个问题.
| 归档时间: |
|
| 查看次数: |
38336 次 |
| 最近记录: |