从“CMake 到底是什么”到“mingw32-make、Ninja 分别扮演谁”——一次把构建流程聊透
本文把初学者最容易混淆的 CMake / Makefile / mingw32-make / Ninja 关系一次讲清,并给出 Windows + Qt + MinGW 编译 OpenCV 的完整踩坑记录,方便以后自查。
1. 一张图看清角色分工
| 工具 | 作用 | 是否直接编译代码 | 类比 |
|---|---|---|---|
| CMake | 根据 CMakeLists.txt 生成“构建脚本”(Makefile / build.ninja / xxx.vcxproj) |
❌ | 编剧——只写剧本 |
| mingw32-make 或 ninja 或 msbuild | 读剧本,调度编译器、链接器开始干活 | ❌ | 导演——喊开机 |
| gcc / g++ / cl.exe | 真正把 .c/.cpp 变 .o,再链接成 .a/.dll/.exe |
✅ | 演员——出镜头 |
总结:CMake 不产生一行机器码,只负责“写剧本”;导演(make/ninja)演员(gcc/cl)才决定片子能不能拍出来。
2. 为什么 CMake 会报错 “CMAKE_MAKE_PROGRAM is not set”
- CMake 在 生成剧本前 要先验货:
“待会儿导演得来,他现在人在不在?” - 找不到
mingw32-make.exe➜ 直接报错退出,连 Makefile 都不写。 - 解决办法:
- 把
.../mingw1310_64/bin加进 PATH; - 或者在配置时显式指名:
-DCMAKE_MAKE_PROGRAM=E:/qthome/Tools/mingw1310_64/bin/mingw32-make.exe
- 把
3. Cmake tool GUI 里那些红色条目是干嘛的
- 只是体检报告。
勾了WITH_PYTHON却检测不到 Python ➜ 标红,自动回退成 OFF。 - CMake 不会 帮你装 Python,也不会 在生成阶段使用 Python;
真正用到它是在编译/链接时,那时缺库才会报错。
4. MinGW 全套流水线最简命令(可复制)
# 1. 打开 Qt 自带的 MinGW 终端,已自动配好 PATH
cd E:\opencv-source
mkdir build-mingw13 && cd build-mingw13
# 2. 生成 Makefile(“写剧本”)
cmake -G "MinGW Makefiles" ^
-DCMAKE_MAKE_PROGRAM=E:/qthome/Tools/mingw1310_64/bin/mingw32-make.exe ^
-DCMAKE_C_COMPILER=E:/qthome/Tools/mingw1310_64/bin/gcc.exe ^
-DCMAKE_CXX_COMPILER=E:/qthome/Tools/mingw1310_64/bin/g++.exe ^
-DCMAKE_BUILD_TYPE=Release ^
-DCMAKE_INSTALL_PREFIX=E:/opencv-mingw13-install ^
-DWITH_QT=ON -DWITH_OPENGL=ON ^
-DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF ..
# 3. 编译 & 安装(“导演喊开机”)
mingw32-make -j%NUMBER_OF_PROCESSORS%
mingw32-make install
5. 换生成器 == 换整条流水线
| 生成器 | 产出剧本 | 后续命令 |
|---|---|---|
-G "Visual Studio 17 2022" |
.sln+.vcxproj |
用 VS 打开 或 msbuild xxx.sln |
-G "MinGW Makefiles" |
Makefile |
mingw32-make -j8 |
-G "Ninja" |
build.ninja |
ninja (多核默认拉满,速度最快) |
同一套
CMakeLists.txt,换生成器即可无缝切换 IDE / 工具链。
6. 常见坑速查表
| 现象 | 原因 | 快速解决 |
|---|---|---|
CMAKE_MAKE_PROGRAM is not set |
找不到 mingw32-make.exe |
加 PATH 或手动指路径 |
error: 'xxxxx' was not declared in this scope |
头文件/库路径没写进剧本 | 重新 cmake -DXXX_INCLUDE_DIR=... 再生成 |
undefined reference to 'cv::imread' |
链接时缺库 | 在 .pro 或 target_link_libraries 里补全 -lopencv_imgcodecs455 等 |
改了 CMakeLists.txt 没生效 |
忘记 重新生成 剧本 | 回到 build 目录再跑一遍 cmake . 或 cmake --build . --target rebuild_cache |
7. 结论
CMake 写剧本,make/ninja 是导演,gcc/cl 才是演员;
任何“找不到工具”的红色警告,都发生在“写剧本”阶段,
只要提前把工具摆到 PATH 里,CMake 就能顺利交稿,后续编译一路绿灯。
把这条流程图保存下来,下次再遇到“CMake 报错”“mingw32-make 找不到”“Ninja 又是啥”时,直接翻这篇就够。

浙公网安备 33010602011771号