【问题标题】:How to convert a dynamic dll to static lib?如何将动态 dll 转换为静态库?
【发布时间】:2011-02-04 08:04:09
【问题描述】:

我写了一个程序helloworld.exe;它取决于 a.dll。我没有 a.dll 的源代码,它是一个动态 dll。如何将其更改为静态库,以便将其链接到 helloworld.exe?

【问题讨论】:

    标签: c++ dll linker static-libraries


    【解决方案1】:

    抱歉,没有直接的方法可以这样做。 DLL 是完全链接的可执行格式文件,其中静态库是收集在一起的单独对象文件的集合。通过一些工作,您可以将静态库转换为 DLL,但反向操作并非易事(委婉地说)。

    【讨论】:

    • +1 是对 OP 原始问题的唯一正确答案。 (我的回答只是一种解决方法)
    • 不仅如此,对于 dll 来说,它们不是可执行文件,而是它们听起来的样子:“动态链接库”有一些工具可以获取 .lib 和 .dll 并将其转换为 .a (静态库)。我什至(在几个场合)简单地重命名(是的,我不知道为什么这在世界上有效)并链接到库并让它工作(尽管它所依赖的库仍然是动态加载的) )
    【解决方案2】:

    正如 Jerry 所说,你不能直接这样做。但是,您可以将您的程序打包成类似于自解压 RAR 文件的文件,该文件将 DLL 作为单个 EXE 的一部分包含在内,它会自动将 EXE 和关联的 DLL 解压缩到临时文件夹并启动主程序。

    【讨论】:

      【解决方案3】:

      错,可以这样做。例如有一个名为dlltolib 的工具可以做到这一点。

      【讨论】:

      • 事实上它在描述中非常清楚地指出它只创建一个导入库:“一个.NET命令行应用程序,它从目标动态链接库(.lib)生成一个导入库(.lib)。 dll)。”
      • @Joe 为什么你认为那是我所说的软件并投反对票?快速的谷歌搜索会显示binary-soft.com/dll2lib/dll2lib.htm 在第一行“将 DLL 文件转换为其等效的静态库”。
      • “快速 google 搜索”将我带到与 Mike 相同的 Github 项目。该评论还与 Mike 提到的软件有关。否决票是因为您的答案不是很清楚,特别是因为它没有包含可以在其中找到该工具的链接。但是你现在改变了,所以我会取消投票。
      • 无论如何,链接工具似乎不太有用,因为它只是 32 位的,现在非常有限。
      • 此外,截至 2019 年 9 月 8 日,单用户开发人员许可证现在为 100 美元,用于 binary-soft 的 dll2lib 工具。
      【解决方案4】:

      我同意 Jerry 的观点,如果是部署问题,您可以使用Nullsoft Scriptable Install System

      【讨论】:

        【解决方案5】:

        在windows上,如果你有相应的def文件,你可以得到lib文件来运行你的程序。您可以使用 Visual Studio 的命令提示符窗口来获取 lib 文件。命令行如下:lib /def:XXX.def /machine:x64(或x86获取32bit lib)/out:XXX.lib。您需要确保def文件和dll文件在同一个文件夹中,并且您已将目录更改为该文件夹。

        【讨论】:

        【解决方案6】:

        我对至少有一个(据说很受欢迎?)答案缺乏理解感到非常震惊。

        我已经从头开始编写了一个链接器,每一行代码。我知道关于 DLL 的一切。

        DLL 包含的信息比 lib 多得多,而且可以保证,它绝对包含 lib 包含的所有内容。每最后一项。

        要将 dll 转换为 lib,您可以按照以下精心编写的文章中提供的简单步骤进行操作。

        https://adrianhenke.wordpress.com/2008/12/05/create-lib-file-from-dll/

        (我不是阿德里安·亨克,仅供参考)

        所描述的过程允许您直接从 dll 创建一个库,而不需要 def 文件。事实上,它实际上允许您从 dll 创建 def 文件,因为 dll 包含所有这些信息。

        我可以保证它可以完美运行,因为我实际上在 dll 上运行了完全相同的进程并检查了结果。该库是正确的,并且允许您链接。

        哦,顺便说一句,将 lib 转换为 dll 是完全、完全、完全不可能的。

        【讨论】:

        • 不知道什么是反对票,但您的链接是 404。adrianhenke.wordpress.com 已被用户删除
        • 这与其他一些答案一样,似乎只会创建导入 .lib,它在运行时仍需要 .dll。真正的静态 .lib 也将包含代码。
        • 不需要态度!这是现已失效链接的archived copied。正如 jpa 所说,该链接仅说明如何制作导入库,而不是包含代码的完整 .lib 。像你一样,我显然没有看到 .dll 中缺少什么会导致无法转换为 lib,除了安排调用它的 DllMain 需要一些努力,但我认为你有点过头了对您的主张充满信心,尤其是因为您还没有提出实际的解决方案。
        • 我想知道为什么有这么多的否定,我猜是因为你没有给 CTRL-C + CTRL-V 简单的东西。完全有可能,我只是反汇编一个 DLL,它给了我“.s”,然后再次“编译”为“.a”。使用标准工具轻松完成。
        猜你喜欢
        • 2011-01-24
        • 1970-01-01
        • 2013-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 2017-09-22
        • 2011-02-16
        相关资源
        最近更新 更多