本文简要介绍在 Windows 上常见的几种 C 编译器/环境,并给出安装、验证与基础编译示例。适合在 d:\projects\ctest 这类目录中快速上手。
快速选择
- 想最快开始:LLVM Clang(通过 winget 安装,命令行友好)
- 更偏 GNU 生态:MSYS2 MinGW-w64(UCRT64 环境,包管理完善)
- 无需安装、解压即用:WinLibs GCC(手动下载压缩包)
- 原生 Windows 工具链:Microsoft cl(VS Build Tools,兼容性佳)
1) LLVM Clang(推荐快速上手)
安装(需 Windows 包管理器 winget):
winget install -e --id LLVM.LLVM --accept-package-agreements --accept-source-agreements
验证版本:
clang --version
若当前终端未刷新 PATH,可使用 8.3 短路径直接调用:
C:\Progra~1\LLVM\bin\clang.exe --version
在 d:\projects\ctest 编译并生成 main.exe:
C:\Progra~1\LLVM\bin\clang.exe -O2 -Wall -Wextra main.c -o main.exe
运行:
.\main.exe
提示:
- 在使用 MSVC 头文件时,
scanf/strcpy可能出现“已弃用”警告,可用更安全的scanf_s/strcpy_s,或在编译时加-D_CRT_SECURE_NO_WARNINGS抑制:clang -D_CRT_SECURE_NO_WARNINGS -O2 -Wall -Wextra main.c -o main.exe
背景与维护
- 来历:LLVM 项目始于 2000 年(伊利诺伊大学 UIUC),Clang 前端由 Chris Lattner 等在 2007 年发起,用于取代 GCC 前端,改进可扩展性与工具生态。
- 维护:由 LLVM 基金会(LLVM Foundation)与全球社区共同维护,来自 Apple、Google、Meta、AMD、NVIDIA 等公司与个人长期贡献。
- 许可:Apache 2.0 with LLVM exceptions。
- Windows 分发:winget 源由微软维护,安装包由 LLVM 官方发布。
2) MSYS2 MinGW-w64(GNU 生态)
下载并安装 MSYS2 后,务必打开“MSYS2 UCRT64”终端(不是 PowerShell)。
首次更新与安装:
pacman -Syu
# 如提示重启终端则关闭后重开 UCRT64 再执行一次
pacman -Syu
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-gcc
编译与运行(UCRT64 终端中):
cd /d/projects/ctest
gcc -O2 -Wall -Wextra main.c -o main.exe
./main.exe
提示:
- MSYS2 有多个环境,建议使用 UCRT64(更接近现代 Windows 运行时)。
- Windows 路径 D:\ 映射为
/d。
背景与维护
- 来历:GCC(GNU Compiler Collection)由 Richard Stallman 于 1987 年发起,属于 GNU 项目;MinGW-w64 项目提供面向 Windows 的 GNU 工具链移植(含 64/32 位支持)。
- 维护:GCC 由 GCC Steering Committee 指导、社区协作开发;MinGW-w64 由社区维护;MSYS2 团队负责在 Windows 上的打包与发行(含 UCRT/MSVCRT 多变体)。
- 许可:GCC 以 GPLv3+ 分发;MinGW-w64 组件多为开源许可证组合;MSYS2 打包遵循各上游许可。
3) WinLibs GCC(解压即用)
从 WinLibs 官方下载预编译的 GCC 压缩包,解压到例如 D:\WinLibs\。
将 D:\WinLibs\mingw64\bin 加入系统或当前会话 PATH,或直接使用绝对路径:
D:\WinLibs\mingw64\bin\gcc.exe -O2 -Wall -Wextra d:\projects\ctest\main.c -o d:\projects\ctest\main.exe
运行:
.\main.exe
优点:无需安装器,独立目录,易于携带或切换版本。
背景与维护
- 来历:WinLibs 是第三方对 GCC/MinGW-w64 的非官方打包发行,面向 Windows 提供“解压即用”的独立构建。
- 维护:WinLibs 项目(社区驱动)负责打包与发布,上游分别来自 GCC 与 MinGW-w64。
- 许可:遵循上游 GCC/MinGW-w64 的开源许可;WinLibs 自身不改变上游许可证。
4) Microsoft cl(VS Build Tools)
安装 Visual Studio Build Tools(选择“C++ build tools”组件)。
使用方式:打开“x64 Native Tools Command Prompt for VS”或“Developer PowerShell for VS”,在该环境中:
cd d:\projects\ctest
cl /O2 /W3 main.c /Fe:main.exe
.\main.exe
优点:与 Windows 原生库兼容性最佳,适合需要 MSVC 工具链的项目。
可选:TCC / Zig
背景与维护
- 来历:Microsoft Visual C++(MSVC)工具链中的 C/C++ 编译器,长期作为 Windows 原生开发的标准工具。
- 维护:由 Microsoft 持续开发与发布,作为 Visual Studio 与 Build Tools 的组成部分。
- 许可:专有软件,随 Visual Studio/Build Tools 许可分发。
- TinyCC (tcc):超快的轻量编译器,功能覆盖较少,适合教学或快速验证。
tcc main.c -o main.exe - Zig CC:
zig cc可作为可移植的 C 编译前端,方便跨平台构建。zig cc main.c -o main.exe
常见注意事项
背景与维护
- TinyCC(TCC)
- 来历:由 Fabrice Bellard 于 2001 年左右创建(其亦创建过 FFmpeg、QEMU),目标是小巧且编译速度极快。
- 维护:由 TinyCC 社区维护(nongnu/savannah 等托管),跨平台可用。
- 许可:LGPL。
- Zig CC
- 来历:Zig 项目由 Andrew Kelley 发起(约 2015),
zig cc/zig c++提供“可移植的 C 编译前端”,便于获取可重复的构建环境。 - 维护:由 Zig 社区维护,Zig Software Foundation 提供支持;内部依赖 LLVM/LLD 等上游组件。
- 许可:Zig 使用 MIT 许可,所捆绑的上游组件遵循各自许可。
- 来历:Zig 项目由 Andrew Kelley 发起(约 2015),
- 路径与空格:含空格的路径需要加引号,或使用 8.3 短路径(如
C:\Progra~1\LLVM\bin)。 - 终端差异:MSYS2 的命令需在对应环境(UCRT64/MINGW64)执行;
pacman不能在 PowerShell 直接用。 - 控制台编码:中文输出建议直接手动运行程序并键入输入,避免
echo | .\main.exe这类管道导致编码混杂。PowerShell 如遇乱码可尝试:[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new() - 控制台编码:中文输出建议直接手动运行程序并键入输入,避免
echo | .\main.exe这类管道导致编码混杂。PowerShell 如遇乱码可尝试:[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new() - 版本查看:
gcc --version/clang --versioncl /Bv
- 抑制 MSVC 安全函数警告:
-D_CRT_SECURE_NO_WARNINGS(Clang/GCC),或改用scanf_s/strcpy_s。
最简编译速记
# Clang(已装 winget 版本)
C:\Progra~1\LLVM\bin\clang.exe -O2 -Wall -Wextra main.c -o main.exe
# MSYS2 UCRT64
gcc -O2 -Wall -Wextra main.c -o main.exe
# WinLibs GCC(解压路径示例)
D:\WinLibs\mingw64\bin\gcc.exe -O2 -Wall -Wextra main.c -o main.exe
# Microsoft cl(在 VS 开发者终端)
cl /O2 /W3 main.c /Fe:main.exe