feat/vtk-merged-dataset-column #10

Merged
gaozheng merged 40 commits from feat/vtk-merged-dataset-column into main 2026-07-01 14:48:38 +08:00
1 changed files with 122 additions and 152 deletions
Showing only changes of commit ceb41fab08 - Show all commits

View File

@ -1,106 +1,82 @@
# Geopro 3.0 桌面客户端 — Windows 开发环境从零搭建指引
适用Windows 10 22H2 / Windows 1164 位,MSVC 2022 工具链
目标:从一台干净的机器,搭到 `cmake --build` 出可运行的 Qt6 + VTK9 桌面程序。
适用Windows 10 22H2 / Windows 1164 位,**MSVC 2022v143工具链**
目标:从一台干净的机器,搭到 `build.bat app` 能编出可运行、且**不因 ABI 不匹配崩溃**的 Qt6 + VTK9 桌面程序。
> 配套设计文档:`docs/superpowers/specs/2026-06-07-geopro-desktop-m1-design.md`
> 最后核对2026-07-01已对齐 `CMakePresets.json` / `vcpkg.json` / 根 `CMakeLists.txt` / `build.bat` 的真实配置。
> ⚠️ 若你手里有更早版本的本文档:**§6.1/§7/§9 曾残留「全 vcpkgQt/VTK 也走 vcpkg」的旧方案与现状矛盾——以本版为准。** 现状是「方案②-修订」:**官方预编译 Qt + 源码编 VTK + vcpkg 只管非 Qt 依赖**。
---
## 0. 总览
## 0. 总览(方案②-修订)
> ⚠️ **构建方案已改定为「方案②-修订」**(经双专家评审 + 实机勘验)。本文档大部分步骤按此更新;**权威步骤以设计 §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 安全。
**单一 Qt = 官方 MSVC 预编译 Qt**`D:\Qt\6.11.1\msvc2022_64`)。**凡依赖 Qt 的组件都不走 vcpkg**vcpkg 的 Qt 端口会再编一份 qtbase = 双份 Qt 冲突):
四块:① 编译器VS18 / MSVC 14.51)② Git ③ vcpkg仅非 Qt 依赖)④ 官方 MSVC Qt + 源码 VTK。
| 组件 | 来源 | 备注 |
|---|---|---|
| Qt 6.11.1Core/Gui/Widgets/Network/Sql/Concurrent/OpenGL + tools | **官方 MSVC 2022 64-bit kit**§4 | 路径由预设 `CMAKE_PREFIX_PATH` 指定 |
| VTK 9.6.xGUISupportQt/RenderingOpenGL2/RenderingFreeType/InteractionStyle/FiltersSources… | **源码 Release 编 → `external/vtk-install`**§5 | 必须对齐同一份 Qt + 同一工具集 + Release/`/MD` |
| ADSQt-Advanced-Docking-System 4.3.1 | **FetchContent 自动**(配置时拉,对接官方 Qt | 无需手动 |
| QtKeychain v0.14.0 | **FetchContent 自动**`BUILD_WITH_QT6` | 无需手动 |
| Qwt 6.2(二维科学图表) | **手工克隆到 `external/qwt-src`**§5.3gitignored | 缺失则详情页图表功能不编入 |
| vendored 3DGPRViewergeopro_gpr3dv | 仓库内 `external/gpr3dviewer`(随仓库) | 无需手动 |
| 非 Qt 依赖eigen3 / gdal / gtest / nlohmann-json / openssl / proj | **vcpkg manifest**`vcpkg.json`,有 baseline 锁版本) | 配置时自动拉 |
**ABI 铁律(否则运行时崩溃,见 §10**Qt(预编译 msvc2022) / VTK(你自己编) / app / 所有 FetchContent 组件,**必须同一工具集(v143)、同一运行时(`/MD`)、同一配置(全 Release)**。任何一处混 Debug/Release 或换工具集,`std::map`/`std::string` 跨界就崩。
---
## 1. Visual Studio 2022MSVC + CMake + Ninja
## 1. Visual StudioMSVC v143 + CMake + Ninja
1. 安装 **Visual Studio 2022 Community**(或更高)。
2. 勾选工作负载 **「使用 C++ 的桌面开发」(Desktop development with C++)**,确保包含:
1. 安装 **Visual Studio 2022 Community**(或更高)。`build.bat` 也兼容 VS2026 preview但**其工具集必须与预编译 Qt 的 msvc2022(v143) ABI 兼容**——若用 VS2026 的更新工具集,稳妥做法是**用同一工具集重编 VTK**§5别让 Qt(v143 预编译) 与 VTK/app(更新工具集) 混。
2. 勾选工作负载 **「使用 C++ 的桌面开发」**,确保含:
- MSVC v143 - VS 2022 C++ x64/x86 生成工具
- Windows 11 SDK或 Windows 10 SDK
- C++ CMake tools for Windows自带 CMake + Ninja
- C++ AddressSanitizer用于 Debug Sanitizer规约 §10.2
3. 验证开「x64 Native Tools Command Prompt for VS 2022」运行
```
cl
cmake --version # 应 ≥ 3.21
ninja --version
```
- C++ CMake tools for Windows自带 CMake ≥3.21 + Ninja
- C++ AddressSanitizerDebug Sanitizer 用)
3. 验证开「x64 Native Tools Command Prompt for VS」`cl` / `cmake --version`≥3.21/ `ninja --version`
> 之后所有 cmake/vcpkg 命令都在 **x64 Native Tools 命令行** 里跑(已设好 MSVC 环境变量)
> `build.bat` 会用 `vswhere` 自动定位 VS 并激活 MSVC 环境,所以**日常构建直接跑 `build.bat` 即可**,不必手动开 x64 命令行。但 `cmake/ninja/cl` **不在 PATH**,手动跑 cmake 前需先激活 vcvars64。
---
## 2. Git
1. 安装 [Git for Windows](https://git-scm.com/download/win)。
2. 验证:`git --version`。
3. 本项目当前**尚未初始化 git 仓库**——首次提交前需 `git init`(见 §7
1. 安装 [Git for Windows](https://git-scm.com/download/win)`git --version` 验证。
2. 本项目**已是 git 仓库**(无需 `git init`);正常 `git clone` 即可。
---
## 3. vcpkg依赖管理
## 3. vcpkg仅非 Qt 依赖)
```powershell
# 选一个不含空格/中文的路径,例如 C:\dev
git clone https://github.com/microsoft/vcpkg C:\dev\vcpkg
git clone https://github.com/microsoft/vcpkg C:\dev\vcpkg # 路径不含空格/中文
C:\dev\vcpkg\bootstrap-vcpkg.bat
setx VCPKG_ROOT "C:\dev\vcpkg" # 永久;新开终端生效
```
设环境变量(系统环境变量或当前会话):
```powershell
$env:VCPKG_ROOT = "C:\dev\vcpkg"
setx VCPKG_ROOT "C:\dev\vcpkg" # 永久(新开终端生效)
```
> 本项目用 **vcpkg manifest 模式**`vcpkg.json`),不需要手动 `vcpkg install`CMake 配置时按清单自动拉取。
- **manifest 模式**:根 `vcpkg.json` 声明依赖 + `builtin-baseline` 锁版本CMake 配置时自动拉取,**无需手动 `vcpkg install`**。
- 实际依赖(勿加 Qt/VTK 进来):`eigen3, gdal, gtest, nlohmann-json, openssl, proj`。
- **不要随意 `vcpkg x-update-baseline`**——baseline 已锁,改动会漂移依赖版本、可能引入 ABI 不一致。
- 首次会编 GDAL/PROJ 等,较久;可选配 `VCPKG_BINARY_SOURCES` 二进制缓存加速。
---
## 4. Qt官方 MSVC 预编译 kit
## 4. Qt官方 MSVC 2022 64-bit kit
**用官方安装器,但必须是 MSVC kit**(你原装的 `mingw_64` 在 MSVC 下不可用):
**必须是 MSVC kit**——若你原装的是 `mingw_64`MSVC 下不可链:
1. `.\qt-online-installer-windows-x64-4.11.0.exe --mirror https://ftp.jaist.ac.jp/pub/qtproject`
2. 打开 `D:\Qt\MaintenanceTool.exe` → Add or remove components → 登录 Qt 账号
3. 展开 Qt → Qt 6.11.1,勾选 **MSVC 2022 64-bit**,安装
4. 完成后存在 `D:\Qt\6.11.1\msvc2022_64\lib\cmake\Qt6`(供 `find_package(Qt6)`)。
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`
4. 预设通过 `CMAKE_PREFIX_PATH=D:/Qt/6.11.1/msvc2022_64` 找到它§6。**全链路只此一份 Qt。**
CMake 经 `CMAKE_PREFIX_PATH=D:/Qt/6.11.1/msvc2022_64` 找到它(见 §6 预设)。**全链路只此一份 Qt**
> 若你的 Qt 装在别处/别的版本:**改预设/环境的 `CMAKE_PREFIX_PATH` 指向你的 `msvc2022_64`,但版本仍须是 6.11.1**(换版本可能与源码编的 VTK/ADS 不匹配)
---
## 5. 依赖来源(方案②-修订
## 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": ["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 重编。
### 5.2 VTK 源码编到 install 前缀(用官方 Qt
实机用 **VTK 9.6.2**(最新稳定,对 Qt 6.11 兼容最好),源码/构建全放 **D:**(C: 仅剩 ~1GB)。脚本见 `external/build_vtk.bat`(已 .gitignore),要点:
### 5.1 VTK 9.6.x 源码编到 `external/vtk-install`(用官方 QtRelease
```bat
call "<VS>\VC\Auxiliary\Build\vcvars64.bat"
@ -114,18 +90,32 @@ cmake -S D:\dev\vtk-src -B D:\dev\vtk-build -G Ninja ^
-D CMAKE_INSTALL_PREFIX=D:/Git/lanbingtech/geopro/external/vtk-install
cmake --build D:\dev\vtk-build --target install
```
完成后 `external/vtk-install/lib/cmake/vtk-9.6``find_package(VTK)`(已在 `CMakePresets.json``VTK_DIR`)。
> 注:VTK 用 **Release** 编。因此**冒烟程序也用 `msvc-release` 预设构建**,以匹配 Release VTK + Release Qt(避免 `/MD` vs `/MDd` 混链)。需要 Debug 调试 VTK 时再出一份 Debug VTK。
- 完成后 `external/vtk-install/lib/cmake/vtk-9.6``find_package(VTK)``CMakePresets.json` 里 `VTK_DIR` 已指向它)。
- **必须 Release + 与本项目相同的工具集(v143)编**;因此**本项目也用 `msvc-release` 构建**,避免 `/MD` vs `/MDd` 或 Debug/Release 混链(→ §10 崩溃)。需要调试 VTK 时另出一份 Debug VTK且此时 app 也须整套 Debug。
- 根 `CMakeLists.txt``find_package(VTK REQUIRED COMPONENTS ...)` **必须列组件**(否则 `VTK_LIBRARIES` 为空、链不到);当前组件:`GUISupportQt / RenderingOpenGL2 / RenderingFreeType / InteractionStyle / FiltersSources`(随渲染层增补)。
### 5.2 ADS / QtKeychainFetchContent自动
无需手动——根 `CMakeLists.txt``FetchContent`**ADS 4.3.1****QtKeychain v0.14.0**,对接同一份官方 Qt`BUILD_WITH_QT6=ON`)。首次配置会 clone需能访问 GitHub。
### 5.3 Qwt 6.2(手工克隆到 `external/qwt-src`
二维科学图表(数据集详情散点/等值线)依赖 Qwt。`external/qwt-src` 已 gitignore须自备
```powershell
# 克隆/解压 Qwt 6.2 源码到 external/qwt-src使 external/qwt-src/src 存在
git clone --branch qwt-6.2 https://git.code.sf.net/p/qwt/git external/qwt-src
```
- CMake 检测到 `external/qwt-src/src` 才 include `cmake/qwt.cmake` 编 Qwt**缺失则相关图表功能不编入**(不报错,但详情图表缺失)。
---
## 6. CMake 接线
## 6. CMake 接线(现状,勿照旧文档)
### 6.1 `CMakePresets.json`(项目根)
### 6.1 `CMakePresets.json`真实内容
```json
{
"version": 3,
"configurePresets": [
{
"name": "msvc-debug",
@ -134,112 +124,92 @@ cmake --build D:\dev\vtk-build --target install
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
"VCPKG_TARGET_TRIPLET": "x64-windows",
"CMAKE_PREFIX_PATH": "D:/Qt/6.11.1/msvc2022_64",
"VTK_DIR": "${sourceDir}/external/vtk-install/lib/cmake/vtk-9.6"
}
},
{
"name": "msvc-release",
"inherits": "msvc-debug",
{ "name": "msvc-release", "inherits": "msvc-debug",
"binaryDir": "${sourceDir}/build/release",
"cacheVariables": { "CMAKE_BUILD_TYPE": "Release" }
}
"cacheVariables": { "CMAKE_BUILD_TYPE": "Release" } }
]
}
```
> 全 vcpkg 方案下**不设 `CMAKE_PREFIX_PATH` 指向官方 Qt**——vcpkg 工具链接管 Qt 查找(避免双 Qt
- **预设确实设 `CMAKE_PREFIX_PATH`(官方 Qt+ `VTK_DIR`(源码编的 VTK**——这是「方案②-修订」的核心,别按旧文档去掉它。
- vcpkg 只经 `CMAKE_TOOLCHAIN_FILE` 管非 Qt 依赖triplet `x64-windows`
### 6.2 顶层 `CMakeLists.txt`(骨架)
### 6.2 `CMakeLists.txt` 要点
```cmake
cmake_minimum_required(VERSION 3.21)
project(geopro_desktop LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
- `find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Network Sql Concurrent)`
- `find_package(VTK REQUIRED COMPONENTS GUISupportQt RenderingOpenGL2 RenderingFreeType InteractionStyle FiltersSources)`**必须列组件**)。
- MSVC flags`/utf-8 /MP /W4 /permissive-`;非 Debug 配置产 PDB`/Zi` + `/DEBUG` + `/OPT:REF,ICF`)。
- ADS/QtKeychain 经 FetchContentQwt 经 `cmake/qwt.cmake`(存在才编)。
- 视图层用 **`QVTKOpenGLStereoWidget`**QOpenGLWidget 系ADS reparent 友好)。
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Network Sql Concurrent)
find_package(VTK REQUIRED) # 含 GUISupportQtvtk[qt])→ QVTKOpenGLStereoWidget
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) # qtkeychain
# ADSvcpkg 端口验证通过后 find_package否则用下方 FetchContent
---
add_subdirectory(src)
enable_testing()
add_subdirectory(tests)
## 7. 首次配置、编译、运行、部署
**日常直接用 `build.bat`(推荐)**
```
> VTK 链接用 `vtk_module_autoinit`;视图层用 **`QVTKOpenGLStereoWidget`**QOpenGLWidget 系ADS reparent 友好,见设计 §K-9不用 native 版。
> **ADS 备选引入**(若 vcpkg 端口不可用spike 阶段确定):
> ```cmake
> include(FetchContent)
> FetchContent_Declare(ads GIT_REPOSITORY https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System.git GIT_TAG <tag>)
> FetchContent_MakeAvailable(ads)
> ```
---
## 7. 首次配置、编译、运行
```powershell
# 在 x64 Native Tools 命令行、项目根目录
git init # 首次:初始化仓库
vcpkg x-update-baseline --add-initial-baseline
cmake --preset msvc-debug # 首次会编译 VTK 等,耗时较长
cmake --build build/debug
# 运行VTK/Qt 的 dll 需在 PATH 或同目录)
.\build\debug\src\app\geopro_desktop.exe
build.bat app # 配置(首次)+ 增量编 geopro_desktopRelease
build.bat test # 编 + ctest 跑单测
build.bat run # 编 + 启动
build.bat rebuild # 强制 --clean-first 全量重编(增量疑似漏编时用)
build.bat configure # CMakeLists 改动后强制重跑 configure
```
- `build.bat` 固定 `--preset msvc-release`、`build/release`,自动激活 MSVC 环境。exe`build/release/src/app/geopro_desktop.exe`。
- 首次会拉 vcpkg 依赖 + FetchContent(ADS/QtKeychain)较久VTK/Qt/Qwt 须已按 §4/§5 就位。
**运行期 DLL 部署(单一 vcpkg 链路)**
- 全部 dll含 Qt来自 vcpkg`build/vcpkg_installed/x64-windows/(debug/)bin`。
- 用 CMake `TARGET_RUNTIME_DLLS` + `add_custom_command(POST_BUILD)` 自动拷贝到 exe 目录(实现阶段加)。
- **不混用官方 Qt 的 `windeployqt`**——本方案 Qt 来自 vcpkg混用会拷错版本造成双 Qt 冲突。
- Qt pluginsplatforms/imageformats/sqldrivers 等)由 vcpkg 部署脚本处理;如缺再用 vcpkg 安装树里的 `windeployqt` 对齐同一份 Qt。
**运行期 DLL 部署(官方 Qt非 vcpkg**
- Qt6*.dll + plugins用**官方 Qt 的 `windeployqt`**`D:\Qt\6.11.1\msvc2022_64\bin\windeployqt.exe`)对齐**同一份官方 Qt** 到 exe 目录。
- VTK*.dll`external/vtk-install/bin` 拷到 exe 目录(或加进 PATH
- **只保证 exe 目录一份 Qt6*.dll无双 Qt**;勿混入别处/vcpkg 的 Qt。
---
## 8. AI 编码上下文基础设施(规约 §10.1,强烈建议先建
## 8. AI/IDE 上下文clangd
项目根放:
- `.clang-format`:统一风格(基于 LLVM/Google + 团队微调)。
- `.clangd`
```yaml
CompileFlags:
CompilationDatabase: build/debug
```
使 clangd 读取 `compile_commands.json`,给 AI/IDE 精确类型上下文。
- VS Code 装 **clangd** 扩展(禁用微软 C++ IntelliSense 避免冲突),或 CLion 直接用 CMake。
- `.clangd``CompileFlags.CompilationDatabase: build/release`(对齐 `build.bat` 的主构建目录;若你主要用 Debug 则指 `build/debug`)。`CMAKE_EXPORT_COMPILE_COMMANDS=ON` 会在该目录产 `compile_commands.json`
- VS Code 用 **clangd** 扩展(禁用微软 C++ IntelliSense 避免冲突)。
---
## 9. 验证清单
## 9. 构建环境兼容性检查清单(交付/接手前逐项核对)
- [ ] `cl` / `cmake` / `ninja` / `git` 命令可用
- [ ] `VCPKG_ROOT` 已设
- [ ] `vcpkg.json` 含 qtbase + vtk[qt](共用一份 Qtpreset **未**指向官方 Qt
- [ ] `cmake --preset msvc-debug` 成功Qt+VTK 已拉取编译,首次较久)
- [ ] `cmake --build` 出 exe
- [ ] exe 能起一个空 Qt 窗 + 一个 `QVTKOpenGLStereoWidget` 渲染窗(冒烟测试)
- [ ] 部署后 exe 目录只有一份 Qt6*.dll无双 Qt
- [ ] `compile_commands.json` 生成clangd 正常索引
> 目的:把「配置错→运行时随机崩溃」变成「一眼可查」。**任何一项不满足都可能导致 §10 的 `std::map`/`std::string` ABI 崩溃。**
### 9.1 前置就位
- [ ] `cl` / `cmake`(≥3.21) / `ninja` / `git` 可用;`VCPKG_ROOT` 已设。
- [ ] Qt **6.11.1****`msvc2022_64`**MSVC非 MinGW存在于 `CMAKE_PREFIX_PATH` 指向处;`.../msvc2022_64/lib/cmake/Qt6` 在。
- [ ] `external/vtk-install/lib/cmake/vtk-9.6` 存在VTK 已源码编 install
- [ ] `external/qwt-src/src` 存在(如需详情页图表)。
- [ ] `vcpkg.json``builtin-baseline` 未被改动。
### 9.2 ABI 一致性(最关键,防崩溃)
- [ ] **单一配置**Qt(预编译) / VTK(你编) / app / ADS / QtKeychain / Qwt **全 Release**(或全 Debug**绝不混**。日常一律 `build.bat`msvc-release
- [ ] **同一工具集**VTK/app 用的 MSVC 工具集与预编译 Qt 的 **v143(msvc2022)** ABI 兼容;若用 VS2026-preview 工具集,**用它重编 VTK**,别让 Qt(v143) 与 VTK/app(更新集) 混。
- [ ] **同一运行时**:全部 `/MD`Release 动态 CRT`_ITERATOR_DEBUG_LEVEL=0`。**绝不把 Release 的 Qt/VTK 链进 Debug 的 app**Debug 是 `/MDd` + IDL=2STL 布局不同)。
- [ ] **VTK 来源正确**:是**你按 §5.1 源码 Release 编、对齐本 Qt** 的那份;**不是** vcpkg 的 VTK、不是别处/别配置的 VTK。
- [ ] **单一 Qt**exe 目录/PATH 只有一份 Qt6*.dll无双 Qt。
### 9.3 干净构建验证
- [ ] 删 `build/``build.bat app` 从零配置**无错**(尤其无「找不到 Qt6/VTK」「add_subdirectory 目录不存在」)。
- [ ] `build.bat test` → ctest 全绿。
- [ ] 启动 app、点对象树、渲染视图**不崩**§10 的崩溃即出现在这里)。
---
## 10. 与设计文档对应的 spike 门槛
## 10. 已知崩溃签名 → 根因速查
本指引服务于设计 §15 的第一周 spike① 全 vcpkg 构建/部署打通(本文);② ADS + `QVTKOpenGLStereoWidget` 浮动/重停靠不黑屏;③ 真实样本跑通 banded contour。三者通过再进入完整实现计划。
| 现象 | 根因 | 处理 |
|---|---|---|
| **点对象树/渲染时,崩在 `std::_Tree::_Find_lower_bound``std::map`/`set` 查找),`_Myhead` 是 `0xFFFF...` 之类垃圾值,读取访问冲突** | **STL ABI 不匹配**Debug/Release 混链、`/MD` vs `/MDd`、`_ITERATOR_DEBUG_LEVEL` 不一致、或工具集不匹配(最常见:**别处/别配置的 VTK/Qt**,或 **Debug app 链 Release 依赖** | 按 §9.2 逐项核对;**删 `build/` 全 Release 干净重建**;确认 VTK 是 §5.1 那份 |
| 链接期报「找不到 Qt6::/VTK::」 | 预设 `CMAKE_PREFIX_PATH`/`VTK_DIR` 指向不存在 | 按 §4/§5 就位或改预设路径 |
| 配置报「add_subdirectory ... 不是已存在目录」 | 引用了未随仓库的目录(如误提交本地临时工具目录) | 从 `CMakeLists.txt` 去掉该引用,或补齐该目录 |
| 详情页图表缺失但不报错 | `external/qwt-src` 未就位§5.3 | 克隆 Qwt 后重配置 |
| 双 Qt / 起不来找不到 platform 插件 | 混入了 vcpkg/别处的 Qt dll | 只用官方 `windeployqt` 对齐单一 Qt |
---
*遇到具体报错VTK/Qt/GDAL 链接、ADS 端口、双 Qt按规约 §10.4 由工程师复核AI 协助按 build-error-resolver 流程逐条解决。*
*遇到具体报错按规约由工程师复核AI 协助按 build-error-resolver 流程逐条解决。*