代码之家  ›  专栏  ›  技术社区  ›  Ran

C++如何在A.exe中编译DLL

  •  7
  • Ran  · 技术社区  · 15 年前

    我正在创建一个C++程序,但是我希望能够向用户提供一个.exe文件。但是,我使用的库(curl等)有一些dll。是否可以将这些dll编译成.exe文件?

    我使用代码::blocks和mingw。

    7 回复  |  直到 12 年前
        1
  •  9
  •   lothar    15 年前

    为了达到你需要的目标 static linking . 这要求所有库(以及它们递归依赖的库)都必须作为静态库可用。请注意,可执行文件的大小将很大,因为它将携带这些静态库中的所有代码。这就是为什么共享库(DLL)首先被发明出来,能够在应用程序之间共享公共代码。然而,这并不总是奏效 so well on windows .

    我想你真正想要的是 installer 安装可执行文件及其所有依赖库。

        2
  •  4
  •   Michael Burr    15 年前

    2002年DDJ上有一篇文章可能有你想要的:

    基本上,它使用msvc的“延迟加载”功能链接到dll,并将dll打包为exe中的嵌入资源。当第一次调用其中一个导出时,将在运行时自动提取DLL。

    我还没有使用过这种技术,所以我不能真正评价它的工作效果,但它看起来确实是一个巧妙的想法。

        3
  •  3
  •   Ichorus    15 年前

    你可以使用 ILMerge

        4
  •  3
  •   dragonfly    15 年前

    我遇见 dll2lib 实用一次。有趣的作品,虽然很昂贵。它允许您将几乎所有的动态链接库转换为静态库,然后将静态库与您的应用程序链接以生成稳定的exe。iirc,自由版本将在从此类生成的库中输入函数时显示某些通知(消息框)。

        5
  •  2
  •   Francis    15 年前

    你需要一些特殊的包装工具,比如 XBundler .

        6
  •  2
  •   shellster    12 年前

    如果您真的需要这样做,您可以使用这个很棒的库,它将允许您从内存中加载一个DLL。我用它从一个资源中读取一个DLL并为我加载它。

    https://github.com/fancycode/MemoryModule

        7
  •  0
  •   MSalters    15 年前

    一般来说,不需要。DLL有一些非常特殊的行为,比如在加载时获取加载器锁,并在这些点调用dllmain。虽然理论链接器可以安排从应用程序main()调用每个dllmain,但在加载的锁下不会发生这种情况。这个加载器锁由操作系统控制。此外,通过dllmain通知dll新线程,这也几乎不可能伪造。