From 57c053c77a19b31d0f8f6a5e1733e88e371188ad Mon Sep 17 00:00:00 2001 From: luochen570 <1160510664@qq.com> Date: Sun, 31 May 2026 12:27:14 +0800 Subject: [PATCH] Add WSL Windows cross build script --- .gitignore | 1 + QtOpenCVImageTool.zip | Bin 8274 -> 9431 bytes build_wsl_windows.sh | 30 ++++++++++++++++++++++++++++++ cmake/toolchains/mingw64.cmake | 11 +++++++++++ readme.md | 20 ++++++++++++++++++++ 5 files changed, 62 insertions(+) create mode 100755 build_wsl_windows.sh create mode 100644 cmake/toolchains/mingw64.cmake diff --git a/.gitignore b/.gitignore index 434fa81..e875cc3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ build/ build-windows/ +build-wsl-windows/ cmake-build-*/ .qt/ .qtc/ diff --git a/QtOpenCVImageTool.zip b/QtOpenCVImageTool.zip index d163681115a0dc8f7b115a49e63414252abfc32c..66ddde7f500603953c0fafa1a3688a4a269a7fc7 100644 GIT binary patch delta 3283 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/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 a7fca5b..40e3319 100644 --- a/readme.md +++ b/readme.md @@ -87,6 +87,26 @@ windeployqt QtOpenCVImageTool.exe 然后把 OpenCV 的运行库 DLL 一并复制到 exe 所在目录,例如 `opencv_world*.dll` 或相关 `opencv_*.dll`。 +## WSL 中交叉编译 Windows 程序 + +WSL 里不能使用 Linux 版 Qt/OpenCV 直接生成 Windows exe,必须准备 Windows 目标库。推荐使用 MinGW-w64 作为交叉编译器,并准备同为 MinGW-w64 目标的 Qt 和 OpenCV。 + +需要的组件: + +- `x86_64-w64-mingw32-g++` +- Windows/MinGW 目标 Qt,目录中应包含 `Qt6Config.cmake` 或 `Qt5Config.cmake` +- Windows/MinGW 目标 OpenCV,目录中应包含 `OpenCVConfig.cmake` + +构建脚本: + +```bash +export QT_MINGW_PREFIX=/opt/mxe/usr/x86_64-w64-mingw32.shared/qt6 +export OpenCV_DIR=/opt/mxe/usr/x86_64-w64-mingw32.shared/lib/cmake/opencv4 +./build_wsl_windows.sh +``` + +如果使用的是自己编译或复制来的 Windows 目标 Qt/OpenCV,把上面两个路径换成实际路径即可。 + ## 说明 本示例中的分类属于简单规则分类,适合作为课程作业演示:根据图像整体亮度判断“偏亮/偏暗/亮度适中”,根据 BGR 平均值判断主色。若需要更高精度分类,可替换为训练好的 OpenCV DNN 或传统机器学习模型。