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