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

我使用 Code::Blocks 和 mingw。

有帮助吗?

解决方案

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

我认为你真正想要的是一个安装你的可执行文件的安装程序。库。

其他提示

DDJ 2002 年的一篇文章可能有您想要的内容:

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

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

您可以使用 ILMerge

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

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

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

https://github.com/fancycode/MemoryModule

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top