必须显式指定-g "mingw makefiles",否则cmake默认选用visual studio生成器而非makefile;需确保gcc和mingw32-make均在path中,且用mingw32-make而非make执行编译。

cmake 在 Windows 上编译 C 语言项目,必须显式指定 MinGW 编译器生成器,否则默认会尝试调用 MSVC(Visual Studio)。这是绝大多数新手卡住的第一步——命令跑通了,但生成的不是 Makefile,而是 Visual Studio 解决方案,接着 mingw32-make 根本没法用。
为什么直接 cmake .. 会失败?
Windows 下 cmake 默认检测到系统里有 Visual Studio 就自动选 Visual Studio 17 2022 这类生成器,哪怕你只装了 MinGW。它不会主动找 gcc,更不会自动生成 Makefile。
- 现象:
cmake ..成功,但mingw32-make报错make: *** No targets. Stop.或提示don't know how to make ... - 根本原因:生成的是
.sln和.vcxproj文件,不是 Makefile - 验证方法:执行
cmake -G查看所有可用生成器,你会看到"MinGW Makefiles"是独立条目,不是默认项
cmake -G "MinGW Makefiles" .. 必须写全
这行命令才是启动 MinGW 编译链的正确入口,漏掉引号、空格或大小写都可能失败。
CMake 4.3.2 Windows x86_64 历史版本安装包,适合旧项目兼容、构建环境回退、CMakeLists.txt 迁移验证、Visual Studio/Ninja/Makefile 生成器测试和 C/C++ 项目维护。
-
-G参数不能省略,它是 generator 的缩写 -
"MinGW Makefiles"必须带英文双引号,中间有空格,大小写敏感(minwg或MinGW makefiles都不行) -
..指向含CMakeLists.txt的源码目录,不能是当前目录(即不能写cmake .) - 如果
gcc不在PATH中,cmake会报The C compiler identification is unknown,此时需先检查gcc --version
构建后必须用 mingw32-make,不是 make
MinGW 提供的是 mingw32-make.exe,不是 Linux 风格的 make。很多教程写 make 是错的,Windows 下它大概率不存在或指向别的工具。
- 执行前确认:
where mingw32-make应返回路径,比如D:\mingw64\bin\mingw32-make.exe - 如果提示
'mingw32-make' is not recognized,说明mingw64\bin没进PATH,或者你装的是msys2环境——它用的是make,但那是另一套 - 编译时若报
undefined reference to `__imp__printf',通常是链接器没选对,常见于混用gcc和clang工具链,或CMAKE_C_COMPILER被错误覆盖
CMakeLists.txt 里别写 project(... CXX)
写成 project(MyProj CXX) 会让 cmake 默认启用 C++ 模式,即使你只编译 .c 文件,也可能触发 g++ 而非 gcc,导致链接失败或符号名混乱。
- 纯 C 项目务必写
project(MyProj C) -
add_executable()的源文件列表里只放.c,别混入.cpp,否则cmake会自动切到 C++ 规则 - 如果用了
set(CMAKE_C_STANDARD 11),确保gcc版本 ≥ 4.7(MinGW-w64 通常满足) - 避免用
aux_source_directory():它不保证文件顺序,多文件依赖时易出错;显式列出.c更可靠
实际能跑通的最小闭环就是这三步:
进入 build 目录 → cmake -G "MinGW Makefiles" .. → mingw32-make。
中间任何一环路径、引号、生成器名、工具链名出错,都会静默失败或报一堆无关错误——这不是配置问题,是 CMake 本身的设计:它不报“你选错了生成器”,只报“找不到目标”或“无法识别编译器”。
13万字C语言保姆级教程(深入):立即使用
在学习笔记中,你将探索c语言的核心概念和高级技巧!










