【问题标题】:Linking : .a, .lib and .def files链接:.a、.lib 和 .def 文件
【发布时间】:2011-09-19 07:57:26
【问题描述】:

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

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

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

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

  • .a 是 Unix 上通常用于静态库的扩展名。 .a 文件是使用 GNU ld 的--out-implib 选项生成的。据说是一个“导入库”,很公平。那么问题是“如果我在链接时不需要导入库对我有什么好处?”

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

  • 我能找到的所有页面都列出了 .def 文件列出了 dll 的导出符号。这不是有点类似于“导入库”应该做的事情吗?

  • 另外,我读到here,使用 .def 文件是在源文件中手动指定导出的替代方法(我这样做了)。但我还记得阅读(找不到返回的引用).def 文件为导出的符号提供了一个索引 (ordinal),从而可以更快地加载运行时。是这样吗?

【问题讨论】:

    标签: windows dll loader


    【解决方案1】:

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

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

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

    在构建 DLL 时,链接器使用 .def 文件以创建导出 (.exp) 文件和导入库 (.lib) 文件。然后链接器使用 导出文件以构建 DLL 文件。 隐式链接到的可执行文件 导入库的 DLL 链接 当它们建成时。 -- MSDN: Exporting from a DLL Using DEF Files

    另请参阅MSDN: Exporting Functions from a DLL by Ordinal Rather Than by Name,它应该可以回答您关于按索引或序号导出的最后一个问题。

    【讨论】:

    • 好的,谢谢 :) 剩下的唯一问题是“为了链接 DLL,需要导入库”对我来说不正确:我只能使用 dll 进行链接。这可能是因为我指定了在 dll 中导出的符号(在汇编程序中使用“-export:function”,这似乎等同于 C 中的“__declspec(dllexport)函数”)?对我来说,这似乎是 .def 文件的替代品,而不是导入库。
    • 我不知道汇编程序可以做什么,也不知道你到底在做什么。在 C 程序中,您还可以调用LoadLibrary(),然后调用GetProcAddress() 在运行时加载 DLL。所以我想在汇编程序中也是可能的。
    • 即使不使用这些调用也没有必要。你可以在这里查看一个简单的例子:norswap.droppages.com/asm/win_bundling/dll
    • 不错的样本! +1 找到了您问题的答案。 “The cygwin/mingw ports of ld support the direct linking, including data symbols, to a dll without the usage of any import libraries. ... 直接链接到 dll 不使用除 -L' and -l 之外的额外命令行开关,因为 ld 已经搜索了许多名称以匹配每个库。...鉴于速度的提高和内存使用,人们可能有理由想知道为什么要使用导入库。有三个原因......“至少从 2002 年开始支持!
    • @Norswap 链接好像失效了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多