提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
开发环境:MSYS2
编译器:mingw64
构建工具:CMake
调试器:GDB
依赖:opencv/qt6
一、安装MSYS2
官网:https://www.msys2.org/
1.下载安装MSYS2
点击msys2-x86_64-20250221.exe,跳转下载页面
安装目录(例如):C:\msys64\
2.安装必要工具链
在MSYS2终端(紫色)中运行:
# 1. 更新基础包
pacman -Syu
# 2. 安装开发工具链
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
# 出现提示时,直接回车确认安装所有13个组件
# 3. 安装构建工具
pacman -S mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja
# 4. 安装调试工具
pacman -S mingw-w64-x86_64-gdb
toolchain-关键组件说明:
3.设置系统环境变量
将MSYS2安装目录下的msys64\mingw64\bin目录添加到系统环境中的Path中
例如:C:\msys64\mingw64\bin
二、安装opencv/qt6
在MSYS2终端(紫色)中运行:
# 1. 安装OpenCV
pacman -S mingw-w64-x86_64-opencv
# 2. 安装qt6
pacman -S mingw-w64-x86_64-qt6-base
说明:OpenCV 的 highgui 模块依赖 Qt6 库
三、验证安装
CMD中运行:
# 验证编译器
g++ --version
# 验证CMake
cmake --version
# 验证OpenCV安装
pkg-config --modversion opencv4
四、项目结构
my_opencv_project/
├── src/
│ └── main.cpp
├── include/
├── build/
└── CMakeLists.txt
五、CMake配置
1. CMakeLists.txt内容
cmake_minimum_required(VERSION 3.10)
project(OpenCV_Project)
# 查找OpenCV包
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# 添加可执行文件
add_executable(main src/main.cpp)
# 链接OpenCV库
target_link_libraries(main ${OpenCV_LIBS})
# 设置编译选项
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
2. main.cpp
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
cv::Mat image = cv::imread("test.jpg");
if(image.empty()) {
std::cerr << "无法加载图像!" << std::endl;
return -1;
}
cv::imshow("显示图像", image);
cv::waitKey(0);
return 0;
}
六、构建与运行
1. 使用MSYS2 MINGW64终端(蓝色)
# 进入项目目录
cd /path/to/my_opencv_project
# 创建构建目录
mkdir -p build && cd build
# 生成构建系统
cmake -G "Ninja" ..
# 编译项目
ninja
# 运行程序
./main.exe
2. 使用Windows命令行
:: 设置MSYS2环境路径
set PATH=C:\msys64\mingw64\bin;%PATH%
:: 后续步骤与MSYS2终端相同
mkdir build && cd build
cmake -G "Ninja" ..
ninja
main.exe
七、调试方法
1. 使用GDB调试
# 编译时添加调试信息(在CMake中设置Debug模式)
cmake -DCMAKE_BUILD_TYPE=Debug ..
# 重新编译
ninja
# 启动GDB调试
gdb ./main.exe
2. GDB常用命令
(gdb) break main # 在main函数设置断点
(gdb) run # 启动程序
(gdb) next # 单步执行
(gdb) print variable # 打印变量值
(gdb) backtrace # 查看调用栈
(gdb) quit # 退出GDB
八、说明
1. 关于OpenCV的安装
通过 MSYS2 的 pacman 安装 OpenCV 与使用 OpenCV 官网提供的预编译包安装区别:
从官网下载最新的包为opencv-4.11.0-windows.exe,为VC16编译版本,是使用 Visual Studio 2019(MSVC 16.x)工具链编译的 OpenCV 库版本。对于mingw64编译器不兼容。在 MSYS2 终端中通过 pacman 安装 OpenCV 后,不需要再从 OpenCV 官网下载安装包安装。这两种安装方式是互斥的,混用可能会导致环境冲突:符号冲突(同一函数两份实现)、内存管理不一致(MSVC 和 GCC 的 C++ ABI 不兼容)、调试信息混乱。
以下需求可能需要官方包:
a.需要专利算法(如 SIFT/SURF),MSYS2 默认不包含专利模块;
b.需要特定版本 CUDA 支持;
c.需要 Java/Python 绑定,MSYS2 需额外安装:
pacman -S mingw-w64-x86_64-opencv-python
在 MSYS2 环境中通过 pacman 安装 OpenCV 后,编译器与头文件查找机制的工作流程
当使用 #include <opencv2/opencv.hpp> 时,编译器通过以下路径自动定位:
a.系统级包含路径,MSYS2 的 OpenCV 安装到标准位置:
/mingw64/include/opencv4/opencv2/opencv.hpp
b.CMake 自动检测,find_package(OpenCV) 会优先查找 MSYS2 的安装路径
2. 关于Ninja
常用指令:
ninja # 默认使用所有CPU核心
ninja -j4 # 限制并行任务数
ninja install # 安装到系统(需CMake中配置)
ninja clean # 清理构建产物
ninja -t targets # 查看构建目标
ninja -t graph | dot -Tpng > graph.png # 依赖关系图
ninja -t commands | sort -k5 -n -r | head -10 # 编译耗时分析
使用前,需先构建系统:
mkdir build && cd build
cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Release ..
3. 关于QT6
OpenCV 的 highgui 模块支持多种后端:
a.Windows 原生:Win32 API
b.跨平台:Qt、GTK
c.基础版:无依赖的简单窗口(仅基本功能)
代码改用非 Qt 后端:
// 在调用 imshow 前强制使用原生后端
cv::namedWindow("显示图像", cv::WINDOW_AUTOSIZE | cv::WINDOW_GUI_NORMAL);
cv::imshow("显示图像", image);
使用其他方式显示图像:
// 保存图像代替显示
cv::imwrite("output.jpg", image);
std::system("start output.jpg"); // 用系统默认程序打开
4. 关于MSYS2
MSYS2 在 Windows 上的 C++ 开发中,提供完整的类 Linux 开发环境。