没有外部依赖项的 Windows GNU 编译器套件

标签 windows gcc

是否有任何免费的、与 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”的回答不是建设性的回答。该问题特别询问如何避免依赖性,而不是确保它们的存在。

最佳答案

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

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

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

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

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

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

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

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

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

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

关于没有外部依赖项的 Windows GNU 编译器套件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7301995/

相关文章:

windows - 查找没有文件的目录 Windows

python - 使用 python 在 Windows 上复制锁定的 dbf 文件

c++ - 堆栈展开真的需要锁吗?

c - 是否可以在 gcc 的 Makefile 中指示一个包含音频文件目录的标志?

netbeans 中的 C++ 编译器错误

windows - cmd 批量调用历史命令

windows - Qt Creator 在自定义流程步骤中将命令名称放在引号内

c - linux GCC中结构的重新定义

c - 将 GCC 移植到 Multiclet

c++ - 'memcpy' 未在此范围内声明