从“CMake 到底是什么”到“mingw32-make、Ninja 分别扮演谁”——一次把构建流程聊透

本文把初学者最容易混淆的 CMake / Makefile / mingw32-make / Ninja 关系一次讲清,并给出 Windows + Qt + MinGW 编译 OpenCV 的完整踩坑记录,方便以后自查。


1. 一张图看清角色分工

工具 作用 是否直接编译代码 类比
CMake 根据 CMakeLists.txt 生成“构建脚本”
(Makefile / build.ninja / xxx.vcxproj)
编剧——只写剧本
mingw32-makeninjamsbuild 读剧本,调度编译器、链接器开始干活 导演——喊开机
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 都不写。
  • 解决办法:
    1. .../mingw1310_64/bin 加进 PATH
    2. 或者在配置时显式指名:
      -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' 链接时缺库 .protarget_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 又是啥”时,直接翻这篇就够。

posted @ 2025-11-20 11:11  Tlink  阅读(21)  评论(0)    收藏  举报