首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链接:.a、.lib和.def文件

问链接:.a、.lib和.def文件
EN

Stack Overflow用户
提问于 2011-06-21 08:36:15
回答 1查看 48.5K关注 0票数 38

我正在使用从Windows上的程序集构建一个dll。

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

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

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

  • .a是Unix上通常用于静态库的扩展。.a文件是使用GNU的-外隐b选项生成的。据说这是一个“导入库”,很公平。问题是“如果链接时不需要导入库,那么导入库对我有什么好处?”
  • .lib是用于Windows上的静态库的扩展,而且根据维基百科的说法,它也被用作windows下的“导入库”,因此我强烈怀疑它们只是二进制文件称为.a文件的另一个名称。对/假?
  • 所有的页面我都可以找到点,.def文件列出了dll的导出符号。这与“导入库”应该做的不有点相似吗?
  • 另外,我读到了这里,使用.def文件可以替代在源文件中手动指定导出(我确实这样做了)。但是,我还记得读取(无法找到引用回来) .def文件向导出的符号提供一个索引(序数),从而允许更快的运行时加载。是这样吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-25 20:55:25

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

导入库(带有MSVC的.lib或带有GCC的.dll.a )是静态库:它们包含加载DLL的代码。前几天我也有同样的问题。

DLL可能具有导出的函数和未导出的函数。导入库必须知道哪些函数被导出,哪些函数没有导出。告诉它的方法之一是一个DEF文件。

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

还请参阅MSDN:按顺序而不是按名称从DLL导出函数,它将按索引或序号回答您关于导出的最后一个问题。

票数 70
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6422478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档