build: 切换为方案②-修订(官方 MSVC Qt + 源码 VTK + vcpkg 仅非Qt依赖)

经双专家评审+实机勘验: 原装 D:\Qt\6.11.1 为 MinGW 版(MSVC 不可链), VTK 无 MSVC 预编译须源码编, VS18=14.51 链官方 Qt(v143) ABI 安全(新链旧)。
- vcpkg.json: 移除 qtbase/qttools/vtk/qtkeychain/qt-advanced-docking-system(凡依赖 Qt 者不走 vcpkg), 仅留非 Qt 依赖
- CMakeLists/CMakePresets: 官方 Qt 经 CMAKE_PREFIX_PATH, VTK 经 VTK_DIR(external/vtk-install), ADS/QtKeychain 走 FetchContent
- 设计 §11/K-8 + ENV_SETUP 改写为方案②-修订; external/ 加入 .gitignore
This commit is contained in:
gaozheng 2026-06-07 18:28:30 +08:00
parent feab14de85
commit c76461609a
8 changed files with 96 additions and 73 deletions

3
.gitignore vendored
View File

@ -8,6 +8,9 @@ CMakeUserPresets.json
/vcpkg_installed/
/vcpkg/
# ---- external source-built deps (方案②-修订: VTK 源码编到 install 前缀) ----
/external/
# ---- Visual Studio / IDE ----
.vs/
.vscode/

View File

@ -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 QtCMAKE_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) # GUISupportQtvtk[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 / QtKeychainFetchContent Qtspike#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)

View File

@ -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" }

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

View File

@ -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官方 + vcpkgDLL/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 等重特性,缩短编译。
- **ADSQt-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 阶段确认。
---

View File

@ -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` 通过。

View File

@ -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 2022C++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.1msvc2022_64预编译 | 官方安装器(MSVC kit) | UI/网络/SQL/并发 | LGPLv3动态 商务 D-2 |
| VTK 9.3[qt,opengl] + gdal/proj 可选) | **源码编→install 前缀** | 三维渲染 + QVTK widget | BSD ✅ |
| ADSQt-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**(规避双 QtM-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`(方案②-修订)。
---

View File

@ -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"
]
}