【问题标题】:Windows GNU compiler suite without external dependencies没有外部依赖的 Windows GNU 编译器套件
【发布时间】:2011-11-10 05:56:22
【问题描述】:

是否有任何免费的、与 GCC 兼容的 Windows 套件可以生成独立的可执行文件而无需外部依赖?

这里有一些不符合要求的,按不受欢迎程度排序,最少到最多:

  • MinGW (MSVCRT.DLL)
  • Cygwin(Cygwin 运行时 DLL)
  • DJGPP(NTVDM.EXE;x64 平台上不存在)

现在我倾向于(并使用,尽管是暂时的)MinGW,因为它似乎是“最干净”的方法。我仍然对 MSVCRT.DLL 依赖关系不感兴趣,尤其是因为我可以而且确实必须与运行 Win2K 之前的客户打交道。 (Windows 2000 是第一个附带 MSVCRT.DLL 的版本)不能随应用程序一起分发 MSVCRT。

P.S.:我知道有人试图为 MinGW 创建一个 MSVCRT 替代品,但它仍然不稳定/测试版,并且功能有限;用于生产应用程序时我会觉得不舒服。

P.P.S.:“无论如何,MSCVRT 通常都在那里”或“只需打包 redist”的答案不是建设性的答案。该问题专门询问如何避免依赖关系,而不是确保它们的存在。

【问题讨论】:

  • MSVCRT 应该作为可再发行组件的一部分安装。在将运行时链接为 DLL 而不是静态链接时,即使是 Microsoft 工具也有此限制。
  • @Yann Ramin:与应用程序一起分发 MSVCRT 不是一种选择。
  • @Merlyn Morgan-Graham:很有帮助,但我正在寻找 MinGW 的替代品,而不是静态链接。
  • @nw:据我所知,由于版权原因。
  • @Unsigned:静态链接(如果成功)将解决问题。 MinGW 可能是您拥有的更成熟的选择之一,我不想因为这样简单的事情而放弃它。您的偏好顺序似乎同意这一点:)

标签: windows gcc


【解决方案1】:

要避免使用 MinGW 进行 MSVCRT,请为链接器使用以下标志:

-nostdlib -Wl,--exclude-libs,msvcrt.a -Wl,-eWinMain

请注意,您必须声明一个名为WinMain 的函数(您也可以为其选择其他名称),这将是您的main。您也不能使用任何标准功能,如strlen、printf 和朋友。相反,您必须使用 WinAPI 等效项,例如 lstrcmp、wsprintf 等。

您可以在以下位置查看使用 SCons 的示例:

https://sourceforge.net/p/nsis/code/6160/tree/NSIS/trunk/SCons/Config/gnu

我已将它用于我的项目,该项目也需要 Windows 9x 兼容性。这也具有较小的可执行文件的良好副作用。从上面的 cmets 来看,您似乎也在寻找它。如果是这种情况,您可以在我上面链接的文件中使用更多技巧。

Microsoft 在以下 KB99456 中有一个将 CRT 函数与 WinAPI 匹配的表:

Win32 Equivalents for C Run-Time Functions(Web Archive)

有关摆脱 CRT 的更多信息(尽管对于 VC,它仍然可以提供帮助):

http://www.catch22.net/tuts/win32/reducing-executable-size

【讨论】:

  • 我也希望看到更多关于静态链接与 libcmt.lib 的内容,但还是很好的答案。
  • 太棒了,还没有尝试过,但我一直在寻找这个信息,人们甚至说我关于这个的问题是一个骗局! stackoverflow.com/questions/23218931/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多