C++ - 如何使使用 MinGW 独立编译的程序?

C++ - How to make a program compiled with MinGW standalone?

我正在开发一个项目(针对 Windows),该项目很小并且应该是可移植的。我在某个地方看到 MinGW 摆脱了目标系统上某些 .dll 的要求,所以我想我会试一试。令我惊讶的是,当我在朋友的计算机上尝试 运行 我的程序时,我收到两个错误,指出缺少 2 个不同的 .dll。我以为MinGW用的是系统dll,但显然不行。我看到一篇关于如何使用 Visual Studio 制作独立 exe 的文章,但我更喜欢使用 MinGW,因为它很简单。

所以我的问题是:如何使用 MinGW 生成独立的 exe?

注意:我只使用标准库,但很高兴知道如何为未来的项目包含其他库。

如果您想了解我所说的独立 exe 的示例,putty 就是一个很好的示例(它是 Windows 的 ssh 客户端)。

您需要的两个库很可能是 libgcc_s_sjlj-1.dlllibstdc++-6.dll 或它们的一些变体,具体取决于构建 mingw 时的配置方式。这些是 C 和 C++ 标准库实现。

如果需要,您可以在 linking 最终可执行文件 -static-libgcc-static-libstdc++ 时将额外的标志传递给编译器,这将导致它 link 这些库是静态的,而不是要求您使用可执行文件为它们分发 DLL。

更多信息在这里:Mingw libgcc_s_sjlj-1.dll is missing

一般来说,您总是可以尝试将 link 库静态地放入您的可执行文件中。这些特殊的 -static-libgcc flags 是 mingw 只提供的特殊标志,其他编译器不提供,也不适用于其他库,你对其他库使用不同的 -static 语法。静态 linking 很好,但随着依赖关系变得更加复杂,它变得更加复杂且容易出错。静态 linking 有一些与库 linked 的顺序相关的陷阱。在某一点之后,让它们全部共享并且不做任何静态 linking 通常更简单。这取决于你,这取决于你的项目变得有多复杂/如果你开始有问题。