加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-13 21:19:27 所属栏目:Windows 来源:网络整理
导读:我使用GNU binutils在Windows上从程序集构建一个DLL。 我知道dll可以在可执行文件加载或运行时加载(使用LoadLibrary api调用)。 对于加载时加载,我似乎只需要dll文件:不需要.a,.lib或.def文件。我想知道这些文件格式代表什么,他们的目的是什么。 我所知
我使用GNU binutils在Windows上从程序集构建一个DLL。

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

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

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

> .a是Unix上通常用于静态库的扩展。 .a文件使用GNU ld的–out-implib选项生成。据说是一个“进口图书馆”,足够公平。那么问题是“如果在链接时不需要它,那么进口图书馆有什么好处?”
> .lib是Windows上用于静态库的扩展,根据wikipedia,Windows也可以使用“import library”,所以我强烈怀疑他们只是binutils调用了.a文件的另一个名字。真假 ?
>所有页面我可以找到.def文件列出dll的导出符号。是不是有点类似于“进口图书馆”应该做什么?
>另外,我读了here,使用.def文件是在源文件(我做的)中手动指定导出的替代方法。但是我也记得读取(找不到参考).def文件提供一个索引(ordinal)到导出的符号中,允许更快的运行时加载。是这样吗 ?

Linux上的静态库具有.a文件扩展名。 Windows上的静态库具有.lib文件扩展名。 Windows上的动态库具有.dll扩展名;为了链接到DLL,需要导入库。导入库是一个静态库。它包含加载DLL所需的代码。现在您使用GCC(而不是cl.exe)在Windows上编译。 GCC对于导入库有另一个文件扩展名约会,它应该称为* .dll.a或* .a“,如您所提及的 doc for the --out-implib中所述。

导入库(带有MSVC或.dll.a的.lib与GCC)是静态库:它们包含加载DLL的代码。 I had the same question the other day.

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

When building the DLL,the linker uses
the .def file to create an export
(.exp) file and an import library
(.lib) file. The linker then uses the
export file to build the DLL file.
Executables that implicitly link to
the DLL link to the import library
when they are built.
— 07002

另请参阅MSDN: Exporting Functions from a DLL by Ordinal Rather Than by Name,一起应该回答你最后一个按索引出口的问题或序号。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读