diff --git a/.gitignore b/.gitignore index e50fd19..b899cfd 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,9 @@ CMakeUserPresets.json /vcpkg_installed/ /vcpkg/ +# ---- external source-built deps (方案②-修订: VTK 源码编到 install 前缀) ---- +/external/ + # ---- Visual Studio / IDE ---- .vs/ .vscode/ diff --git a/CMakeLists.txt b/CMakeLists.txt index c568d71..6d13477 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,18 +16,30 @@ if(MSVC) add_compile_options(/utf-8 /MP /W4 /permissive-) endif() -# ---- Dependencies(全 vcpkg;见 vcpkg.json / docs/ENV_SETUP_Windows.md)---- +# ===================================================================== +# 构建方案②-修订(设计 §11 / K-8 / docs/ENV_SETUP_Windows.md) +# - 单一 Qt = 官方 MSVC 预编译 Qt(CMAKE_PREFIX_PATH 指向 D:/Qt/6.11.1/msvc2022_64) +# - VTK: 预先用官方 Qt 源码编并 install 到 VTK_DIR(见 ENV_SETUP / Phase 0) +# - ADS / QtKeychain: 经 FetchContent 对接同一份官方 Qt(绝不走 vcpkg,避免双 Qt) +# - 仅非 Qt 依赖(GDAL/PROJ/OpenSSL/Eigen/...)走 vcpkg +# ===================================================================== + find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Network Sql Concurrent) -find_package(VTK REQUIRED) # 含 GUISupportQt(vtk[qt])→ QVTKOpenGLStereoWidget -# 以下依赖随分层逐步启用(spike 后接入业务层): +find_package(VTK REQUIRED) # 来自 VTK_DIR(预编 install 前缀);含 GUISupportQt + +# 非 Qt 依赖(vcpkg),随分层逐步启用: # find_package(GDAL CONFIG REQUIRED) # find_package(PROJ CONFIG REQUIRED) # find_package(Eigen3 CONFIG REQUIRED) # find_package(spdlog CONFIG REQUIRED) # find_package(nlohmann_json CONFIG REQUIRED) # find_package(OpenSSL REQUIRED) -# find_package(Qt6Keychain CONFIG REQUIRED) -# find_package(qtadvanceddocking-qt6 CONFIG REQUIRED) # ADS, spike#2 接入(端口名以实际为准) + +# ADS / QtKeychain:FetchContent 对接官方 Qt(spike#2 接入;体量小,源码编可接受) +# include(FetchContent) +# FetchContent_Declare(ads GIT_REPOSITORY https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System.git GIT_TAG 4.3.1) +# FetchContent_Declare(qtkeychain GIT_REPOSITORY https://github.com/frankosterfeld/qtkeychain.git GIT_TAG 0.14.3) +# FetchContent_MakeAvailable(ads qtkeychain) add_subdirectory(src) diff --git a/CMakePresets.json b/CMakePresets.json index 0b9a338..08c691f 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -4,19 +4,21 @@ "configurePresets": [ { "name": "msvc-debug", - "displayName": "MSVC Debug (vcpkg)", + "displayName": "MSVC Debug (官方Qt + vcpkg 非Qt依赖)", "generator": "Ninja", "binaryDir": "${sourceDir}/build/debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", "CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", "VCPKG_TARGET_TRIPLET": "x64-windows", - "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON", + "CMAKE_PREFIX_PATH": "D:/Qt/6.11.1/msvc2022_64", + "VTK_DIR": "${sourceDir}/external/vtk-install/lib/cmake/vtk-9.3" } }, { "name": "msvc-release", - "displayName": "MSVC Release (vcpkg)", + "displayName": "MSVC Release (官方Qt + vcpkg 非Qt依赖)", "inherits": "msvc-debug", "binaryDir": "${sourceDir}/build/release", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release" } diff --git a/ScreenShot/ScreenShot_2026-06-07_182524_854.png b/ScreenShot/ScreenShot_2026-06-07_182524_854.png new file mode 100644 index 0000000..679304e Binary files /dev/null and b/ScreenShot/ScreenShot_2026-06-07_182524_854.png differ diff --git a/docs/ENV_SETUP_Windows.md b/docs/ENV_SETUP_Windows.md index 45680be..4fad8d3 100644 --- a/docs/ENV_SETUP_Windows.md +++ b/docs/ENV_SETUP_Windows.md @@ -9,13 +9,12 @@ ## 0. 总览 -四块:① 编译器(VS2022 / MSVC)② Git ③ 依赖管理(vcpkg + CMake)④ 全量依赖(含 Qt/VTK,走 vcpkg)。 +> ⚠️ **构建方案已改定为「方案②-修订」**(经双专家评审 + 实机勘验)。本文档大部分步骤按此更新;**权威步骤以设计 §11 + `docs/superpowers/plans/2026-06-07-m1-phase0-spikes.md` 为准**。 +> +> **方案②-修订要点**:单一 Qt = **官方 MSVC 预编译 Qt**(`D:\Qt\6.11.1\msvc2022_64`)。**凡依赖 Qt 的组件(VTK/ADS/QtKeychain)都不走 vcpkg**(vcpkg 的 Qt 依赖端口会再编一份 qtbase = 双份冲突):VTK 用官方 Qt 源码编到 install 前缀;ADS/QtKeychain 走 FetchContent;仅非 Qt 依赖(GDAL/PROJ/OpenSSL/Eigen/...)走 vcpkg。 +> **关键事实**:① 用户原装 `D:\Qt\6.11.1` 是 **MinGW 版**(MSVC 不可链),须在 Qt 维护工具里补装 **MSVC 2022 64-bit** kit;② VTK 无 MSVC 预编译,三方案都必须源码编;③ 本机 VS18 = MSVC 14.51,链官方 Qt(v143)属"新链旧",ABI 安全。 -> **构建方案已定:全 vcpkg(方案 B)。** 原因(已核 vcpkg `ports/vtk/vcpkg.json`):嵌 VTK 进 Qt 必须用 `QVTKOpenGLNativeWidget`/`QVTKOpenGLStereoWidget`(在 VTK 的 `GUISupportQt` 模块),该模块要求 `vtk[qt]`,而 `vtk[qt]` 依赖 vcpkg 的 `qtbase`+`qtdeclarative`。若再叠加 Qt 官方安装器,会出现**两份 Qt(官方 + vcpkg)DLL/ABI 冲突**(典型表现:运行期 plugin 加载失败或崩溃)。故全家共用同一份 vcpkg Qt。 -> -> 代价:首次编译 Qt+VTK 较久(数小时级),用二进制缓存(`VCPKG_BINARY_SOURCES`)缓解;CI 同此方案保证可复现。 -> -> (若确有理由保留官方 Qt,须为 vcpkg 的 vtk/qtkeychain 配 overlay-port 指向官方 Qt、禁止 vcpkg 重复构建 Qt——复杂易错,不推荐。) +四块:① 编译器(VS18 / MSVC 14.51)② Git ③ vcpkg(仅非 Qt 依赖)④ 官方 MSVC Qt + 源码 VTK。 --- @@ -64,44 +63,57 @@ setx VCPKG_ROOT "C:\dev\vcpkg" # 永久(新开终端生效) --- -## 4. Qt(不单独装——随 vcpkg 全量构建) +## 4. Qt(官方 MSVC 预编译 kit) -方案 B 下 **Qt 不用官方安装器**,由 vcpkg 的 `qtbase`/`qttools` 以及 `vtk[qt]` 共同复用同一份 Qt(见 §5)。这样 VTK、QtKeychain、ADS、应用本体全部链接同一 Qt,杜绝双份 Qt 冲突。 +**用官方安装器,但必须是 MSVC kit**(你原装的 `mingw_64` 在 MSVC 下不可用): + +1. 打开 `D:\Qt\MaintenanceTool.exe` → Add or remove components → 登录 Qt 账号。 +2. 展开 Qt → Qt 6.11.1,勾选 **MSVC 2022 64-bit**,安装。 +3. 完成后存在 `D:\Qt\6.11.1\msvc2022_64\lib\cmake\Qt6`(供 `find_package(Qt6)`)。 + +CMake 经 `CMAKE_PREFIX_PATH=D:/Qt/6.11.1/msvc2022_64` 找到它(见 §6 预设)。**全链路只此一份 Qt**。 --- -## 5. 全量依赖:`vcpkg.json`(项目根,M1 清单) +## 5. 依赖来源(方案②-修订) + +| 类别 | 组件 | 来源 | +|---|---|---| +| Qt | qtbase/widgets/network/sql/concurrent/opengl + tools | 官方 MSVC kit(§4) | +| VTK | vtk 9.3[qt,opengl](+gdal/proj 可选) | **源码编 → install 前缀**(§5.2) | +| Qt 依赖小件 | ADS、QtKeychain | **FetchContent 对接官方 Qt**(§6.2) | +| 非 Qt 依赖 | gdal/proj/openssl/eigen3/spdlog/fmt/nlohmann-json/gtest | **vcpkg**(下方 vcpkg.json) | + +### 5.1 `vcpkg.json`(仅非 Qt 依赖) ```json { "name": "geopro-desktop", "version": "0.1.0", - "dependencies": [ - { "name": "qtbase", "default-features": false, "features": ["gui", "widgets", "network", "sql", "sql-sqlite", "concurrent", "opengl"] }, - "qttools", - { "name": "vtk", "default-features": false, "features": ["qt", "opengl", "gdal", "proj"] }, - "gdal", - "proj", - "eigen3", - "spdlog", - "fmt", - "nlohmann-json", - "openssl", - "qtkeychain", - "gtest" - ], - "builtin-baseline": "<运行 vcpkg x-update-baseline 自动填入>", - "overrides": [] + "dependencies": ["gdal","proj","eigen3","spdlog","fmt","nlohmann-json","openssl","gtest"] } ``` +- **凡依赖 Qt 的(vtk[qt]/qtkeychain/qt-advanced-docking-system)绝不放进 vcpkg**——否则 vcpkg 会再编一份 qtbase = 双份 Qt 冲突(已核 `ports/vtk/vcpkg.json`)。 +- `vcpkg x-update-baseline --add-initial-baseline` 锁版本(规约 §5.4)。 +- 先配 `VCPKG_BINARY_SOURCES` 二进制缓存(实测当前为空),省 GDAL/PROJ 重编。 -说明: -- **`vtk[qt]`** 拉入 vcpkg `qtbase`+`qtdeclarative`(已核 vcpkg `ports/vtk/vcpkg.json`);与上面显式声明的 `qtbase` 复用同一份 Qt——这是方案 B 的关键。 -- **`vtk` 用 `default-features:false` 只选 `qt/opengl/gdal/proj`**,避免默认拉入 netcdf/seacas/libharu/cgns 等重特性,缩短编译。 -- **ADS(Qt-Advanced-Docking-System)**:vcpkg 端口 `qt-advanced-docking-system`——**端口可用性/对 Qt6 支持需在 spike 阶段先验证**;不可用则改 FetchContent 锁 tag(见 §6 备注)。验证通过后加进 dependencies。 -- **PCL 不引入**(M1 点规模无需 KD-tree)。 -- `builtin-baseline`:`vcpkg x-update-baseline --add-initial-baseline` 自动写入,锁版本(规约 §5.4)。 -- 首次编译 Qt+VTK 久,配 `VCPKG_BINARY_SOURCES`(如本地/网络二进制缓存)显著提速。 +### 5.2 VTK 源码编到 install 前缀(用官方 Qt) + +```powershell +# 在 x64 Native Tools for VS18 命令行 +git clone --depth 1 --branch v9.3.1 https://gitlab.kitware.com/vtk/vtk.git C:\dev\vtk-src +cmake -S C:\dev\vtk-src -B C:\dev\vtk-build -G Ninja ` + -D CMAKE_BUILD_TYPE=Release ` + -D VTK_GROUP_ENABLE_Qt=YES ` + -D VTK_MODULE_ENABLE_VTK_GUISupportQt=YES ` + -D Qt6_DIR="D:/Qt/6.11.1/msvc2022_64/lib/cmake/Qt6" ` + -D CMAKE_PREFIX_PATH="D:/Qt/6.11.1/msvc2022_64" ` + -D BUILD_SHARED_LIBS=ON -D VTK_BUILD_TESTING=OFF -D VTK_BUILD_EXAMPLES=OFF ` + -D CMAKE_INSTALL_PREFIX="D:/Git/lanbingtech/geopro/external/vtk-install" +cmake --build C:\dev\vtk-build --target install +``` +完成后 `external/vtk-install/lib/cmake/vtk-9.3` 供 `find_package(VTK)`(已在 `CMakePresets.json` 设 `VTK_DIR`)。`external/` 已 .gitignore。 +> 注:VTK 用 Release 编;Debug app 链 Release VTK 在 Windows 通常可行(VTK 不强依赖 Debug CRT 的 STL 边界),若遇 `/MD` vs `/MDd` 冲突,则再出一份 Debug VTK。spike 阶段确认。 --- diff --git a/docs/superpowers/plans/2026-06-07-m1-phase0-spikes.md b/docs/superpowers/plans/2026-06-07-m1-phase0-spikes.md index ffec735..c2fdbfb 100644 --- a/docs/superpowers/plans/2026-06-07-m1-phase0-spikes.md +++ b/docs/superpowers/plans/2026-06-07-m1-phase0-spikes.md @@ -8,7 +8,9 @@ **Tech Stack:** CMake 3.21+ / vcpkg(manifest) / MSVC 2022 / Qt 6.8 / VTK 9.3+ / ADS / GoogleTest。 -**前置条件(由你完成,见 `docs/ENV_SETUP_Windows.md`):** 已装 VS2022(C++ 桌面开发 + AddressSanitizer)、Git、vcpkg 并设 `VCPKG_ROOT`。所有命令在 **x64 Native Tools for VS 2022** 命令行、项目根目录执行。 +> ⚠️ **本计划部分步骤将按「方案②-修订」更新**(官方 MSVC Qt + 源码 VTK + vcpkg 非 Qt 依赖)。当前 Task 1/3 的"全 vcpkg"描述待改写;**权威构建步骤见设计 §11 + `docs/ENV_SETUP_Windows.md`(§4/§5)**。核心差异:Qt 用官方 MSVC kit(不 vcpkg)、VTK 源码编到 `external/vtk-install`、ADS/QtKeychain 走 FetchContent。 + +**前置条件(由你完成,见 `docs/ENV_SETUP_Windows.md`):** 已装 **VS18(MSVC 14.51)**、Git、vcpkg 并设 `VCPKG_ROOT`、**官方 Qt 6.11.1 的 MSVC 2022 64-bit kit**。所有命令在 **x64 Native Tools** 命令行、项目根目录执行。 **通过判据汇总(三 spike 全绿才进入 Phase 1):** - S1 构建/部署:`cmake --build` 出 `geopro_desktop.exe`,运行显示锥体;exe 目录只有一份 `Qt6*.dll`;`ctest` 通过。 diff --git a/docs/superpowers/specs/2026-06-07-geopro-desktop-m1-design.md b/docs/superpowers/specs/2026-06-07-geopro-desktop-m1-design.md index 165117e..3026bb1 100644 --- a/docs/superpowers/specs/2026-06-07-geopro-desktop-m1-design.md +++ b/docs/superpowers/specs/2026-06-07-geopro-desktop-m1-design.md @@ -45,7 +45,7 @@ | K-5 | M1 三维内容 | ① 基础 + ② dd_voxel(可信体,图分阶段)+ ④ DEM;③ 雷达、⑤ 底图瓦片留 M1.5 | | K-6 | 三维插值实现 | C++ 进程内(IDW 起步),`IInterpolator` 接口隔离、**返回 core 中立类型**;推迟完整插件架构(D-1/D-3) | | K-7 | 坐标系 | **每数据源各记源 CRS + 各自 LocalFrame** → 统一 rebase 到唯一「项目世界系(局部米,含 Z 基准)」;GIS/经纬/底图用 PROJ 实时换算(见 §5) | -| K-8 | 构建/部署 | **全 vcpkg(方案 B)**:Qt 与 VTK[qt] 共用同一份 vcpkg Qt,规避双份 Qt DLL/ABI 冲突 | +| K-8 | 构建/部署 | **方案②-修订**(经双专家评审+实机勘验改定):单一 Qt = **官方 MSVC 预编译 Qt**(`D:\Qt\6.11.1\msvc2022_64`);**VTK/ADS/QtKeychain 对接该官方 Qt**(VTK 源码编到 install 前缀、ADS/QtKeychain 走 FetchContent),**绝不走 vcpkg**(否则 vcpkg 再拉一份 Qt = 双份);仅非 Qt 依赖(GDAL/PROJ/OpenSSL/Eigen/...)走 vcpkg。**关键事实**:用户原装的 `D:\Qt\6.11.1` 是 **MinGW 版**,MSVC 下不可链,须补装 MSVC kit;VTK 无 MSVC 预编译、三方案均须源码编;VS18=MSVC 14.51 链官方 Qt(v143)属"新链旧"ABI 安全。 | | K-9 | 视图 widget | 评估 **`QVTKOpenGLStereoWidget`(QOpenGLWidget 系)** 优先于 native,缓解 ADS reparent 上下文丢失(spike 验证) | | K-10 | dd_voxel 可信度 | 维持可信体目标;可信度取决于输入数据充分性(≥3 非共线剖面或 3D 网格),列为数据依赖(见 §10、§14) | @@ -266,28 +266,33 @@ IDatasetRepository { --- -## 11. 构建与依赖(K-8,全 vcpkg) +## 11. 构建与依赖(K-8,方案②-修订:官方 MSVC Qt + 源码 VTK + vcpkg 非 Qt 依赖) -- **构建**:CMake 3.21+ + **vcpkg manifest(全量,含 Qt)**;生成 `compile_commands.json`。MSVC 2022,C++17。 -- **关键依赖事实**(已核 vcpkg `ports/vtk/vcpkg.json`):`qt` 非 vtk 默认特性;`vtk[qt]` 依赖 `qtbase(gui/opengl/widgets/sql-sqlite)` + `qtdeclarative`。→ 用 `vtk` 时显式开 `qt`,**全家共用同一份 vcpkg Qt**(K-8)。用 `default-features:false` 仅选 `qt/opengl/gdal/proj`,避免拉入 netcdf/seacas/libharu 等重特性。 +- **构建**:CMake 3.21+。MSVC 工具集 **VS18 / 14.51**(实机),C++17;生成 `compile_commands.json`。 +- **单一 Qt 纪律(核心)**:全链路只用**一份官方 MSVC 预编译 Qt**(`D:\Qt\6.11.1\msvc2022_64`,经 `CMAKE_PREFIX_PATH`)。**凡依赖 Qt 的组件都不走 vcpkg**(vcpkg 任何 Qt 依赖端口都会再编一份 qtbase = 双份冲突,已核 `ports/vtk/vcpkg.json`:`vtk[qt]`→`qtbase`+`qtdeclarative`)。 +- **VTK**:无 MSVC 预编译,**必须源码编**。预先用官方 Qt 把 VTK 9.3 配置/编译/`install` 到 `external/vtk-install`(`-DVTK_GROUP_ENABLE_Qt=YES -DQt6_DIR=...`),app 经 `VTK_DIR` `find_package(VTK)`。一次编好、隔离于 app 构建。 +- **ADS / QtKeychain**:经 **FetchContent** 对接同一份官方 Qt(体量小,源码编可接受),**不走 vcpkg**。 +- **非 Qt 依赖经 vcpkg**:GDAL/PROJ/OpenSSL/Eigen/spdlog/fmt/nlohmann-json/gtest(这些不拉 Qt)。 - **M1 依赖矩阵**: -| 依赖(vcpkg 名) | 用途 | 许可证 | -|---|---|---| -| qtbase / qttools / qtdeclarative | UI/网络/SQL/并发(VTK[qt] 亦复用) | LGPLv3(动态)⚠️ 商务 D-2 | -| vtk[qt,opengl,gdal,proj] | 三维渲染 + QVTK widget | BSD ✅ | -| gdal / proj | DEM/影像/坐标重投影 | MIT 类 ✅ | -| qt-advanced-docking-system(端口可用性 spike 验证;不可用则 FetchContent 锁 tag) | 停靠布局 | LGPL v2.1 ✅ | -| qtkeychain(共用同一 Qt) | 凭证存储 | BSD ✅ | -| openssl | RSA/HTTPS | Apache 2.0 ✅ | -| eigen3 | 数值/插值 | MPL2 ✅ | -| spdlog / fmt | 日志 | MIT ✅ | -| nlohmann-json | JSON | MIT ✅ | -| gtest | 单测 | BSD ✅ | +| 依赖 | 来源 | 用途 | 许可证 | +|---|---|---|---| +| Qt 6.11.1(msvc2022_64,预编译) | 官方安装器(MSVC kit) | UI/网络/SQL/并发 | LGPLv3(动态)⚠️ 商务 D-2 | +| VTK 9.3([qt,opengl] + gdal/proj 可选) | **源码编→install 前缀** | 三维渲染 + QVTK widget | BSD ✅ | +| ADS(Qt-Advanced-Docking-System) | FetchContent(对接官方 Qt) | 停靠布局 | LGPL v2.1 ✅ | +| QtKeychain | FetchContent(对接官方 Qt) | 凭证存储 | BSD ✅ | +| gdal / proj | vcpkg | DEM/影像/坐标重投影 | MIT 类 ✅ | +| openssl | vcpkg | RSA/HTTPS | Apache 2.0 ✅ | +| eigen3 | vcpkg(头文件) | 数值/插值 | MPL2 ✅ | +| spdlog / fmt | vcpkg | 日志 | MIT ✅ | +| nlohmann-json | vcpkg(头文件) | JSON | MIT ✅ | +| gtest | vcpkg | 单测 | BSD ✅ | - ~~PCL~~:**M1 移除**(点规模不需要)。 -- 部署:单一 vcpkg 链路(`TARGET_RUNTIME_DLLS` + vcpkg deploy),**不混用 windeploypt 与官方 Qt**(规避双 Qt,M-5)。 -- 环境从零搭建:见 `docs/ENV_SETUP_Windows.md`(已改为方案 B 为主)。 +- **ABI**:官方 Qt 为 MSVC 2022(v143)预编译,本机 VS18(14.51)编 VTK/app/ADS/QtKeychain;"新链旧"在 MSVC v14x 兼容区内**安全**,全程动态 CRT `/MD[d]`、Release 链 Release、Debug 链 Debug,不跨配置混链。 +- 部署:用**官方 Qt 的 `windeployqt`**(`D:\Qt\6.11.1\msvc2022_64\bin\windeployqt.exe`)部署 Qt + 插件;VTK/vcpkg dll 用 `TARGET_RUNTIME_DLLS` 拷贝。确保 exe 目录只有这一份 Qt。 +- **二进制缓存**:vcpkg 实测无缓存,落地前先配 `VCPKG_BINARY_SOURCES`(省 GDAL/PROJ 等重编)。 +- 环境从零搭建:见 `docs/ENV_SETUP_Windows.md`(方案②-修订)。 --- diff --git a/vcpkg.json b/vcpkg.json index 03b07c2..06f5f6a 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,19 +1,8 @@ { "name": "geopro-desktop", "version": "0.1.0", - "description": "Geopro 3.0 desktop client (Qt6 + VTK9) - M1", + "description": "Geopro 3.0 desktop client (Qt6 + VTK9) - M1. 方案②-修订: 仅非 Qt 依赖走 vcpkg; Qt/VTK/ADS/QtKeychain 对接官方 MSVC Qt(见 docs/ENV_SETUP_Windows.md)", "dependencies": [ - { - "name": "qtbase", - "default-features": false, - "features": ["gui", "widgets", "network", "sql", "sql-sqlite", "concurrent", "opengl"] - }, - "qttools", - { - "name": "vtk", - "default-features": false, - "features": ["qt", "opengl", "gdal", "proj"] - }, "gdal", "proj", "eigen3", @@ -21,8 +10,6 @@ "fmt", "nlohmann-json", "openssl", - "qtkeychain", - "qt-advanced-docking-system", "gtest" ] }