From 804a5db77d387f2cf3a5e56fceaa39f52ddadf3f Mon Sep 17 00:00:00 2001 From: luochen570 <1160510664@qq.com> Date: Sun, 31 May 2026 12:48:56 +0800 Subject: [PATCH] Update Windows build documentation --- QtOpenCVImageTool.zip | Bin 0 -> 10352 bytes build_windows.bat | 46 +++++++ build_wsl_windows.sh | 30 +++++ cmake/toolchains/mingw64.cmake | 11 ++ readme.md | 211 ++++++++++++++++++++++++++++----- 5 files changed, 266 insertions(+), 32 deletions(-) create mode 100644 QtOpenCVImageTool.zip create mode 100644 build_windows.bat create mode 100755 build_wsl_windows.sh create mode 100644 cmake/toolchains/mingw64.cmake diff --git a/QtOpenCVImageTool.zip b/QtOpenCVImageTool.zip new file mode 100644 index 0000000000000000000000000000000000000000..78f45c56e00e0b9f595c0d629bac16e13183e7e1 GIT binary patch literal 10352 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 literal 0 HcmV?d00001 diff --git a/build_windows.bat b/build_windows.bat new file mode 100644 index 0000000..9c13188 --- /dev/null +++ b/build_windows.bat @@ -0,0 +1,46 @@ +@echo off +setlocal + +rem Usage: +rem build_windows.bat C:\Qt\6.6.0\msvc2019_64 C:\opencv\build\x64\vc16\lib "Visual Studio 17 2022" +rem build_windows.bat C:\Qt\6.6.0\mingw_64 C:\opencv-mingw\install "MinGW Makefiles" + +if "%~1"=="" ( + echo Usage: %~nx0 ^ ^ [CMakeGenerator] + echo Example MSVC : %~nx0 C:\Qt\6.6.0\msvc2019_64 C:\opencv\build\x64\vc16\lib "Visual Studio 17 2022" + echo Example MinGW: %~nx0 C:\Qt\6.6.0\mingw_64 C:\opencv-mingw\install "MinGW Makefiles" + exit /b 1 +) + +if "%~2"=="" ( + echo Missing OpenCV_DIR. + exit /b 1 +) + +set QT_DIR=%~1 +set OPENCV_DIR=%~2 +set GENERATOR=%~3 + +if "%GENERATOR%"=="" ( + set GENERATOR=Visual Studio 17 2022 +) + +if not exist build-windows ( + mkdir build-windows +) + +if /I "%GENERATOR%"=="MinGW Makefiles" ( + cmake -S . -B build-windows -G "%GENERATOR%" -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="%QT_DIR%" -DOpenCV_DIR="%OPENCV_DIR%" +) else ( + cmake -S . -B build-windows -G "%GENERATOR%" -A x64 -DCMAKE_PREFIX_PATH="%QT_DIR%" -DOpenCV_DIR="%OPENCV_DIR%" +) + +if errorlevel 1 exit /b %errorlevel% + +cmake --build build-windows --config Release +if errorlevel 1 exit /b %errorlevel% + +echo. +echo Build finished. +echo For MSVC, check: build-windows\Release\QtOpenCVImageTool.exe +echo For MinGW, check: build-windows\QtOpenCVImageTool.exe diff --git a/build_wsl_windows.sh b/build_wsl_windows.sh new file mode 100755 index 0000000..eeca5db --- /dev/null +++ b/build_wsl_windows.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -euo pipefail + +if ! command -v x86_64-w64-mingw32-g++ >/dev/null 2>&1; then + echo "Missing x86_64-w64-mingw32-g++." + echo "Install it in WSL with: sudo apt install mingw-w64" + exit 1 +fi + +if [[ "${QT_MINGW_PREFIX:-}" == "" ]]; then + echo "Missing QT_MINGW_PREFIX." + echo "Example: export QT_MINGW_PREFIX=/opt/mxe/usr/x86_64-w64-mingw32.shared/qt6" + exit 1 +fi + +if [[ "${OpenCV_DIR:-}" == "" ]]; then + echo "Missing OpenCV_DIR." + echo "Example: export OpenCV_DIR=/opt/mxe/usr/x86_64-w64-mingw32.shared/lib/cmake/opencv4" + exit 1 +fi + +cmake -S . -B build-wsl-windows \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/mingw64.cmake \ + -DCMAKE_PREFIX_PATH="${QT_MINGW_PREFIX}" \ + -DOpenCV_DIR="${OpenCV_DIR}" + +cmake --build build-wsl-windows --config Release + +echo "Windows executable should be under build-wsl-windows/." diff --git a/cmake/toolchains/mingw64.cmake b/cmake/toolchains/mingw64.cmake new file mode 100644 index 0000000..0dcfb71 --- /dev/null +++ b/cmake/toolchains/mingw64.cmake @@ -0,0 +1,11 @@ +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR x86_64) + +set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) +set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) +set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/readme.md b/readme.md index 40e3319..b549775 100644 --- a/readme.md +++ b/readme.md @@ -20,72 +20,219 @@ - 图像分类:根据平均亮度和主色通道给出简单分类,同时显示目标数量。 - 线程处理:图像处理工作对象运行在 `QThread` 中,避免阻塞界面。 -## Windows 编译运行 +## Windows 构建说明 -本工程用于构建 Windows 桌面应用程序。建议使用 Qt Creator 打开 `CMakeLists.txt` 构建,编译器可选择 MSVC 或 MinGW,但 Qt、OpenCV 和编译器位数必须一致,例如全部使用 64 位。 +本工程使用 CMake 管理,目标是构建 Windows 桌面应用程序 `QtOpenCVImageTool.exe`。推荐使用 **MSVC 64 位**,因为 OpenCV 官方 Windows 预编译包通常就是 MSVC 版本,配置最省事。 -### 环境准备 +构建时请保持三者一致: -1. 安装 Qt for Windows,推荐 Qt 6.x,并安装对应的 MinGW 64-bit 或 MSVC 64-bit 组件。 -2. 安装 OpenCV for Windows,或自行用相同编译器编译 OpenCV。 -3. 安装 CMake。Qt Creator 通常会自带可用的 CMake。 +- 编译器一致:MSVC 对 MSVC,MinGW 对 MinGW。 +- 位数一致:建议全部使用 64 位。 +- Qt、OpenCV、CMake 使用同一套构建环境。 -### Qt Creator 构建 +如果使用 MSVC,则不要混用 MinGW 版 Qt;如果使用 MinGW,则不要直接使用 OpenCV 官方 MSVC 预编译包。 + +### 需要安装的软件 + +1. Visual Studio 2022 或 Visual Studio 2022 Build Tools + +安装时勾选: + +```text +Desktop development with C++ +MSVC v143 x64/x86 build tools +Windows 10 SDK 或 Windows 11 SDK +C++ CMake tools for Windows +``` + +安装完成后,系统中应能找到类似路径: + +```text +C:\Program Files\Microsoft Visual Studio\2022\Community +C:\Program Files\Microsoft Visual Studio\2022\BuildTools +``` + +2. Qt for Windows + +使用 Qt Online Installer 安装 Qt。推荐安装 Qt 6.x,并勾选 MSVC 64 位组件,例如: + +```text +Qt 6.6.x +MSVC 2019 64-bit 或 MSVC 2022 64-bit +Qt Creator +``` + +安装完成后,Qt 路径通常类似: + +```text +C:\Qt\6.6.0\msvc2019_64 +C:\Qt\6.6.0\msvc2022_64 +``` + +该目录下应存在: + +```text +C:\Qt\6.6.0\msvc2019_64\lib\cmake\Qt6\Qt6Config.cmake +``` + +3. OpenCV for Windows + +可以使用 OpenCV 官方 Windows 包。解压或安装到例如: + +```text +C:\opencv +``` + +常见的 CMake 配置路径是: + +```text +C:\opencv\build\x64\vc16\lib +``` + +该目录下应存在: + +```text +C:\opencv\build\x64\vc16\lib\OpenCVConfig.cmake +``` + +4. CMake + +如果安装 Visual Studio 时勾选了 CMake 工具,通常已经够用。也可以单独安装 CMake for Windows。命令行检查: + +```bat +cmake --version +``` + +### 推荐方式:Qt Creator 构建 1. 打开 Qt Creator。 -2. 选择“打开项目”,打开本目录下的 `CMakeLists.txt`。 -3. 选择 Windows Kit,例如 `Desktop Qt 6.x MinGW 64-bit` 或 `Desktop Qt 6.x MSVC 64-bit`。 -4. 如果 CMake 找不到 OpenCV,在 CMake 配置中加入: +2. 选择“打开项目”,打开本目录的 `CMakeLists.txt`。 +3. 选择 Windows Kit,例如: + +```text +Desktop Qt 6.x.x MSVC 2019 64-bit +Desktop Qt 6.x.x MSVC 2022 64-bit +``` + +4. 如果 CMake 找不到 OpenCV,在 Qt Creator 的 CMake 配置项中添加: ```text OpenCV_DIR=C:/opencv/build/x64/vc16/lib ``` -实际路径以你的 OpenCV 安装目录为准。MinGW 自编译 OpenCV 时,应填写包含 `OpenCVConfig.cmake` 的目录。 +5. 配置完成后点击“构建”。 +6. 构建成功后会生成 `QtOpenCVImageTool.exe`。 +7. 在 Qt Creator 中点击“运行”即可启动程序。 -5. 点击“构建”并运行。 +### 命令行构建:MSVC -### 命令行构建示例 +打开开始菜单中的: -也可以直接使用项目提供的 `build_windows.bat`: - -```bat -build_windows.bat C:\Qt\6.6.0\mingw_64 C:\opencv\build "MinGW Makefiles" +```text +x64 Native Tools Command Prompt for VS 2022 ``` -或 MSVC: +进入工程目录,例如: + +```bat +cd /d D:\QtOpenCVImageTool +``` + +使用项目提供的脚本构建: ```bat build_windows.bat C:\Qt\6.6.0\msvc2019_64 C:\opencv\build\x64\vc16\lib "Visual Studio 17 2022" ``` -MinGW 示例: +如果你的 Qt 是 MSVC 2022 版本,路径可改为: ```bat -mkdir build -cd build -cmake .. -G "MinGW Makefiles" -DCMAKE_PREFIX_PATH=C:\Qt\6.6.0\mingw_64 -DOpenCV_DIR=C:\opencv\build -cmake --build . --config Release +build_windows.bat C:\Qt\6.6.0\msvc2022_64 C:\opencv\build\x64\vc16\lib "Visual Studio 17 2022" ``` -MSVC 示例: +也可以手动执行 CMake: ```bat -mkdir build -cd build +mkdir build-windows +cd build-windows cmake .. -G "Visual Studio 17 2022" -A x64 -DCMAKE_PREFIX_PATH=C:\Qt\6.6.0\msvc2019_64 -DOpenCV_DIR=C:\opencv\build\x64\vc16\lib cmake --build . --config Release ``` -### 运行和发布 +MSVC 生成的 exe 通常位于: -在 Windows 上运行生成的 `QtOpenCVImageTool.exe` 时,需要能找到 Qt 和 OpenCV 的 DLL。调试阶段可在 Qt Creator 中直接运行;发布时可使用: - -```bat -windeployqt QtOpenCVImageTool.exe +```text +build-windows\Release\QtOpenCVImageTool.exe ``` -然后把 OpenCV 的运行库 DLL 一并复制到 exe 所在目录,例如 `opencv_world*.dll` 或相关 `opencv_*.dll`。 +### 命令行构建:MinGW + +如果使用 MinGW,需要安装 MinGW 版 Qt,并准备 MinGW 编译出来的 OpenCV。不要把 MSVC 版 OpenCV 直接给 MinGW 使用。 + +示例: + +```bat +build_windows.bat C:\Qt\6.6.0\mingw_64 C:\opencv-mingw\install "MinGW Makefiles" +``` + +手动构建: + +```bat +mkdir build-windows +cd build-windows +cmake .. -G "MinGW Makefiles" -DCMAKE_PREFIX_PATH=C:\Qt\6.6.0\mingw_64 -DOpenCV_DIR=C:\opencv-mingw\install +cmake --build . --config Release +``` + +MinGW 生成的 exe 通常位于: + +```text +build-windows\QtOpenCVImageTool.exe +``` + +### 运行和发布 + +构建出来的 `QtOpenCVImageTool.exe` 运行时需要 Qt 和 OpenCV 的 DLL。开发阶段可以直接在 Qt Creator 中运行;如果要单独拷贝给别人运行,需要把依赖 DLL 一起放到 exe 目录。 + +MSVC Release 示例: + +```bat +cd build-windows\Release +C:\Qt\6.6.0\msvc2019_64\bin\windeployqt.exe QtOpenCVImageTool.exe +copy C:\opencv\build\x64\vc16\bin\opencv_world*.dll . +``` + +如果 OpenCV 不是 `opencv_world*.dll`,则复制对应的 `opencv_*.dll` 到 exe 所在目录。 + +MinGW 示例: + +```bat +cd build-windows +C:\Qt\6.6.0\mingw_64\bin\windeployqt.exe QtOpenCVImageTool.exe +copy C:\opencv-mingw\bin\opencv_*.dll . +``` + +### 常见问题 + +1. `Could not find Qt6` + +说明 `CMAKE_PREFIX_PATH` 没有指向 Qt 安装目录。请确认路径类似: + +```text +C:\Qt\6.6.0\msvc2019_64 +``` + +2. `Could not find OpenCV` + +说明 `OpenCV_DIR` 没有指向包含 `OpenCVConfig.cmake` 的目录。请搜索 `OpenCVConfig.cmake`,并把它所在目录传给 CMake。 + +3. 程序启动时报缺少 DLL + +请运行 `windeployqt`,并把 OpenCV 的 DLL 复制到 exe 所在目录。 + +4. 链接时报 MSVC/MinGW 相关错误 + +通常是 Qt、OpenCV、编译器不匹配。MSVC 工程必须使用 MSVC 版 Qt 和 MSVC 版 OpenCV;MinGW 工程必须使用 MinGW 版 Qt 和 MinGW 版 OpenCV。 ## WSL 中交叉编译 Windows 程序