cmake在windows默认不生成makefile而调用visual studio生成器,需显式指定生成器(如mingw或ninja)并配好工具链;构建.exe关键在于选对生成器、配置工具链、执行正确命令链。

cmake 在 Windows 上默认不生成 Makefile,而是尝试调用 Visual Studio 生成器(如 Visual Studio 17 2022),直接产出 .sln 解决方案文件。想得到可执行文件 .exe,关键不是“能不能”,而是**选对生成器、配好工具链、走对构建命令链**。
为什么 cmake . 不生成 Makefile?
因为 Windows 下 cmake 没指定生成器时,会按系统环境自动匹配:有 VS 就用 VS 生成器,没 VS 但有 MinGW 且在 PATH 里,也不一定自动选它——cmake 默认不猜,必须显式指定。
-
cmake .→ 通常生成CMakeCache.txt+ALL_BUILD.vcxproj等 VS 工程文件,不是Makefile -
cmake -G "MinGW Makefiles" .→ 才会生成Makefile(前提是 MinGW 的mingw32-make.exe在PATH) -
cmake -G "Ninja"→ 更快,但需提前装 Ninja,且不依赖make命令
用 MinGW 生成 hello.exe 的三步实操
假设你已有 main.cpp 和基础 CMakeLists.txt(含 add_executable(hello main.cpp)),目录干净:
- 确认 MinGW 已安装,且
mingw32-make.exe所在路径(如C:\MinGW\bin)已加入系统PATH - 终端进入源码目录,运行:
cmake -S . -B build -G "MinGW Makefiles"(推荐用-S/-B分离源/构建设目录) - 进
build目录:cd build,再运行:mingw32-make(别用make,Windows 默认没有这个命令)
成功后,build/hello.exe 即生成。注意:add_executable 第一个参数名就是最终 exe 文件名,不带扩展名。
VS 生成器下怎么拿到 exe?
如果你用的是 Visual Studio(比如 VS2022),更稳妥的路径是:
- 运行:
cmake -S . -B build -G "Visual Studio 17 2022" -A Win64(-A指定架构) - 然后:
cmake --build build --config Release(不用打开 VS,命令行直接构建)
生成的 .exe 默认在 build\Release\ 下,不是 Debug —— 因为 --config Release 显式指定了配置。漏掉 --config 参数,cmake --build 可能只构建 Debug 或报错。
add_executable 的 WIN32 参数容易误用
写 add_executable(myapp WIN32 main.cpp) 看似合理,但实际会让程序入口变成 WinMain,控制台输出(如 std::cout)可能不显示,且调试时看不到命令行窗口。
- 普通命令行程序:去掉
WIN32,保持默认main入口 - 真正 GUI 程序(无黑框):才加
WIN32,并确保实现WinMain或链接libmingw32等支持库 - 加了
WIN32后若仍想看到控制台,可在代码开头加:AllocConsole(); freopen("CONOUT$", "w", stdout);
最常被忽略的是:CMake 本身不编译,它只生成构建指令;而真正决定 .exe 是否能跑、有没有输出、链接是否成功,全在生成器和后续构建命令里——不是 CMakeLists.txt 写对就万事大吉。











