geopro/docs/ENV_SETUP_Windows.md

246 lines
9.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Geopro 3.0 桌面客户端 — Windows 开发环境从零搭建指引
适用Windows 10 22H2 / Windows 1164 位MSVC 2022 工具链。
目标:从一台干净的机器,搭到能 `cmake --build` 出可运行的 Qt6 + VTK9 桌面程序。
> 配套设计文档:`docs/superpowers/specs/2026-06-07-geopro-desktop-m1-design.md`
---
## 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 安全。
四块:① 编译器VS18 / MSVC 14.51)② Git ③ vcpkg仅非 Qt 依赖)④ 官方 MSVC Qt + 源码 VTK。
---
## 1. Visual Studio 2022MSVC + CMake + Ninja
1. 安装 **Visual Studio 2022 Community**(或更高)。
2. 勾选工作负载 **「使用 C++ 的桌面开发」(Desktop development with 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
```
> 之后所有 cmake/vcpkg 命令都在 **x64 Native Tools 命令行** 里跑(已设好 MSVC 环境变量)。
---
## 2. Git
1. 安装 [Git for Windows](https://git-scm.com/download/win)。
2. 验证:`git --version`。
3. 本项目当前**尚未初始化 git 仓库**——首次提交前需 `git init`(见 §7
---
## 3. vcpkg依赖管理
```powershell
# 选一个不含空格/中文的路径,例如 C:\dev
git clone https://github.com/microsoft/vcpkg C:\dev\vcpkg
C:\dev\vcpkg\bootstrap-vcpkg.bat
```
设环境变量(系统环境变量或当前会话):
```powershell
$env:VCPKG_ROOT = "C:\dev\vcpkg"
setx VCPKG_ROOT "C:\dev\vcpkg" # 永久(新开终端生效)
```
> 本项目用 **vcpkg manifest 模式**`vcpkg.json`),不需要手动 `vcpkg install`CMake 配置时按清单自动拉取。
---
## 4. Qt官方 MSVC 预编译 kit
**用官方安装器,但必须是 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)`)。
CMake 经 `CMAKE_PREFIX_PATH=D:/Qt/6.11.1/msvc2022_64` 找到它(见 §6 预设)。**全链路只此一份 Qt**。
---
## 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),要点:
```bat
call "<VS>\VC\Auxiliary\Build\vcvars64.bat"
git clone --depth 1 --branch v9.6.2 https://gitlab.kitware.com/vtk/vtk.git D:\dev\vtk-src
cmake -S D:\dev\vtk-src -B D:\dev\vtk-build -G Ninja ^
-D CMAKE_BUILD_TYPE=Release -D BUILD_SHARED_LIBS=ON ^
-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 VTK_BUILD_TESTING=OFF -D VTK_BUILD_EXAMPLES=OFF ^
-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。
---
## 6. CMake 接线
### 6.1 `CMakePresets.json`(项目根)
```json
{
"version": 3,
"configurePresets": [
{
"name": "msvc-debug",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/debug",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
}
},
{
"name": "msvc-release",
"inherits": "msvc-debug",
"binaryDir": "${sourceDir}/build/release",
"cacheVariables": { "CMAKE_BUILD_TYPE": "Release" }
}
]
}
```
> 全 vcpkg 方案下**不设 `CMAKE_PREFIX_PATH` 指向官方 Qt**——vcpkg 工具链接管 Qt 查找(避免双 Qt
### 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) # 含 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)
```
> 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
```
**运行期 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。
---
## 8. AI 编码上下文基础设施(规约 §10.1,强烈建议先建)
项目根放:
- `.clang-format`:统一风格(基于 LLVM/Google + 团队微调)。
- `.clangd`
```yaml
CompileFlags:
CompilationDatabase: build/debug
```
使 clangd 读取 `compile_commands.json`,给 AI/IDE 精确类型上下文。
- VS Code 装 **clangd** 扩展(禁用微软 C++ IntelliSense 避免冲突),或 CLion 直接用 CMake。
---
## 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. 与设计文档对应的 spike 门槛
本指引服务于设计 §15 的第一周 spike① 全 vcpkg 构建/部署打通(本文);② ADS + `QVTKOpenGLStereoWidget` 浮动/重停靠不黑屏;③ 真实样本跑通 banded contour。三者通过再进入完整实现计划。
---
*遇到具体报错VTK/Qt/GDAL 链接、ADS 端口、双 Qt按规约 §10.4 由工程师复核AI 协助按 build-error-resolver 流程逐条解决。*