From c76461609adbaad5df48ae3900edabdbee573b69 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Sun, 7 Jun 2026 18:28:30 +0800 Subject: [PATCH] =?UTF-8?q?build:=20=E5=88=87=E6=8D=A2=E4=B8=BA=E6=96=B9?= =?UTF-8?q?=E6=A1=88=E2=91=A1-=E4=BF=AE=E8=AE=A2(=E5=AE=98=E6=96=B9=20MSVC?= =?UTF-8?q?=20Qt=20+=20=E6=BA=90=E7=A0=81=20VTK=20+=20vcpkg=20=E4=BB=85?= =?UTF-8?q?=E9=9D=9EQt=E4=BE=9D=E8=B5=96)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 经双专家评审+实机勘验: 原装 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 --- .gitignore | 3 + CMakeLists.txt | 22 +++-- CMakePresets.json | 8 +- .../ScreenShot_2026-06-07_182524_854.png | Bin 0 -> 74039 bytes docs/ENV_SETUP_Windows.md | 76 ++++++++++-------- .../plans/2026-06-07-m1-phase0-spikes.md | 4 +- .../2026-06-07-geopro-desktop-m1-design.md | 41 +++++----- vcpkg.json | 15 +--- 8 files changed, 96 insertions(+), 73 deletions(-) create mode 100644 ScreenShot/ScreenShot_2026-06-07_182524_854.png 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 0000000000000000000000000000000000000000..679304e0493511d32d5dc3ca6a36daa1d74f63a5 GIT binary patch literal 74039 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 H{r$fHULw(p literal 0 HcmV?d00001 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" ] }