C ++如何在.exe中编译dll

时间:2009-05-01 14:52:51

标签: c++ dll compilation

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

我使用Code :: Blocks和mingw。

8 个答案:

答案 0 :(得分:10)

为了实现这一目标,您需要static linking。这要求所有库(以及它们递归依赖的库)都需要作为静态库提供。请注意,可执行文件的大小会很大,因为它将携带来自这些静态库的所有代码。这就是为什么首先发明共享库(DLL),以便能够在应用程序之间共享公共代码。但是,这并不总是有效so well on windows

我认为您真正想要的是installer,它可以安装您的可执行文件及其所有依赖库。

答案 1 :(得分:4)

2002年的DDJ中有一篇文章可能有你想要的东西:

基本上,它使用MSVC的“延迟加载”功能组合链接到DLL,并将DLL打包为EXE中的嵌入式资源。然后,在第一次调用其中一个导出时,会在运行时自动提取DLL。

我没有使用过这种技术,所以我无法评论它的效果如何,但它确实看起来像是一个灵巧的想法。

答案 2 :(得分:3)

您可以使用ILMerge

答案 3 :(得分:3)

我曾经遇到dll2lib实用程序。有趣的作品虽然价格昂贵。它允许您将几乎任何dll转换为静态库,稍后可能会与您的应用程序链接以生成实体exe。 IIRC,免费版将在从这样生成的库中输入函数时显示某些通知(MessageBox)。

答案 4 :(得分:2)

您需要一些特殊的打包工具,例如XBundler

答案 5 :(得分:2)

如果你真的需要完成这个,你可以使用这个很棒的库,它允许你从内存加载DLL。我用它来从资源中读取DLL并为我加载它。

https://github.com/fancycode/MemoryModule

答案 6 :(得分:1)

我是 C++ 和 CODE::BLOCKS 的新手(大约一周后),我遇到了同样的问题。答案很好,但是对于像我这样的完整菜鸟来说,实施它们并没有得到解释。 (就像告诉一个穴居人把钥匙放在点火装置上。“什么是钥匙?什么是点火装置”?)经过足够的探索,我编译(没有双关语)这个解决方案:

在 CODE::BLOCKS 菜单上(我有 v20.03),点击“设置”,然后点击“编译器...”。

在左侧,单击“全局编译器设置”(默认)。

在“编译器设置”选项卡下,选中以下复选框:
静态 libgcc [-static-libgcc]
静态 libstdc++ [-static-libstdc++]

在“链接器设置”选项卡下,在“其他链接器选项:”框中输入以下内容:
-static -lpthread

点击“确定”,你就是金子!您编译的 C++ EXE 可以独立运行。

我已经通过编译我的几个课程项目进行了尝试,并且成功了。它增加了大约 2.3MB 的 EXE 大小。没有承诺这将适用于您的所有项目,只是到目前为止它对我有用。


更新,2021 年 1 月 12 日 -- 缩小您的 EXE!:

在“编译器设置”选项卡中,向下滚动到“优化”并检查:
从二进制中去除所有符号(最小化大小)[-s]

这将我编译的其中一个 EXE 文件从 2354k 缩小到 820k!

答案 7 :(得分:0)

一般来说,没有。 DLL具有一些非常重要的特殊行为,例如在加载时获取Loader Lock并在这些点调用DllMain。虽然理论链接器可以安排从应用程序main()调用每个DllMain,但它不会在Loaded Lock下发生。该Loader Lock受操作系统的控制。此外,DLL通过他们的DLLMain通知新线程,这也几乎不可能伪造。