cmake_minimum_required(VERSION 3.21) project(geopro_desktop LANGUAGES CXX) # ---- Global C++ settings (规约 §3.2: C++17, 可渐进 C++20) ---- set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Qt 自动工具(仅 view/app 层需要 moc/uic/rcc) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) if(MSVC) # 显式钉死 MSVC 运行时库:Release=/MD,Debug=/MDd,杜绝静默漂移(ABI 一致性,见 ENV_SETUP §9.2)。 set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") add_compile_options(/utf-8 /MP /W4 /permissive-) # 生成 PDB——即使 Release 优化构建也产出调试符号,使 minidump / 运行期崩溃栈可符号化分析 # (生产桌面端排障必需)。/Zi 编译期调试信息;/DEBUG 链接产 PDB;/OPT:REF,ICF 抵消 /DEBUG # 默认关掉的优化,保持二进制优化+精简。仅非 Debug 配置启用。 add_compile_options($<$>:/Zi>) add_link_options($<$>:/DEBUG> $<$>:/OPT:REF> $<$>:/OPT:ICF>) endif() # ===================================================================== # 构建方案②-修订(设计 §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 # ===================================================================== # ===================================================================== # 构建环境护栏(把「配置错→运行时随机崩溃」变成「配置期一眼可查」) # 校准基准:本机 Qt 6.11.1 msvc2022_64 + VTK 9.6.x + VS2026-preview 工具集。 # 工具集只 WARN 不 FATAL(本机 VS2026-preview 与预编译 Qt v143 ABI 兼容、可正常构建)。 # 详见 docs/ENV_SETUP_Windows.md §4/§5/§9。 # ===================================================================== if(WIN32) # QT_ROOT 环境变量必须已设且指向有效的官方 MSVC Qt kit(预设的 CMAKE_PREFIX_PATH 读它)。 if(NOT DEFINED ENV{QT_ROOT} OR "$ENV{QT_ROOT}" STREQUAL "" OR NOT EXISTS "$ENV{QT_ROOT}/lib/cmake/Qt6") message(FATAL_ERROR "QT_ROOT 未设置或无效。请 setx QT_ROOT \"<你的Qt>\\6.11.1\\msvc2022_64\" 后重开终端。见 docs/ENV_SETUP_Windows.md §4。") endif() endif() find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Network Sql Concurrent) # Qt 版本护栏:major.minor 必须是 6.11(任意补丁号可)。换大小版本会与源码编的 VTK/ADS ABI/兼容性错位。 if(NOT Qt6_VERSION VERSION_LESS 6.11 AND Qt6_VERSION VERSION_LESS 6.12) # 6.11.x —— 合规。 else() message(FATAL_ERROR "Qt 版本不匹配:找到 ${Qt6_VERSION},需要 6.11.x(与源码编的 VTK/ADS 兼容)。请安装 6.11.1 msvc2022_64 并把 QT_ROOT 指向它。见 docs/ENV_SETUP_Windows.md §4。") endif() # VTK 就位护栏(friendly):find_package REQUIRED 也会失败,但这里给出可操作的原因。 if(NOT EXISTS "${CMAKE_SOURCE_DIR}/external/vtk-install/lib/cmake/vtk-9.6") message(FATAL_ERROR "VTK 未就位。请按 docs/ENV_SETUP_Windows.md §5.1 源码 Release 编 VTK 9.6.x 到 external/vtk-install。") endif() # VTK 9 必须指定 COMPONENTS,否则 VTK_LIBRARIES 为空、链接不到任何 VTK。 # 来自 VTK_DIR(external/vtk-install)。随渲染层增补模块(Volume/Filters 等)。 find_package(VTK REQUIRED COMPONENTS GUISupportQt RenderingOpenGL2 RenderingFreeType # 导航 gizmo 轴标签(vtkBillboardTextActor3D)运行时字形渲染:注册 FreeType 工厂 InteractionStyle FiltersSources ) # VTK 版本护栏:major.minor 须为 9.6(VTK_DIR 路径已带 vtk-9.6,越界基本是误装/误指)。 if(VTK_VERSION VERSION_LESS 9.6 OR NOT VTK_VERSION VERSION_LESS 9.7) message(FATAL_ERROR "VTK 版本不匹配:找到 ${VTK_VERSION},需要 9.6.x。请按 docs/ENV_SETUP_Windows.md §5.1 用同一 Qt/工具集重编到 external/vtk-install。") endif() # 工具集护栏(仅 WARN,绝不 FATAL):预编译 Qt 是 msvc2022(v143);VTK 必须与 app 用同一工具集编, # 否则 std::map/std::string 跨界 ABI 崩溃(见 §10)。本机 VS2026-preview 与 v143 兼容、可正常构建。 if(MSVC AND NOT MSVC_TOOLSET_VERSION STREQUAL "143") message(WARNING "MSVC 工具集为 v${MSVC_TOOLSET_VERSION}(非 v143)。预编译 Qt 为 msvc2022(v143);请确保 external/vtk-install 的 VTK 与本 app 用【同一工具集】编,避免 ABI 不匹配崩溃。见 docs/ENV_SETUP_Windows.md §9.2。") endif() # 非 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) # ADS(停靠):FetchContent 对接官方 Qt(spike S2)。QtKeychain 待登录层再加。 include(FetchContent) set(ADS_VERSION 4.3.1 CACHE STRING "" FORCE) set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) set(BUILD_STATIC OFF CACHE BOOL "" FORCE) FetchContent_Declare(ads GIT_REPOSITORY https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System.git GIT_TAG 4.3.1) FetchContent_MakeAvailable(ads) # QtKeychain(凭证安全存取,规约 §7.4:登录"记住一个月"免登录):FetchContent 对接官方 Qt。 # 必须指定 Qt6(默认走 Qt5 会找不到包);静态链接避免额外 DLL;关测试程序与翻译省依赖。 set(BUILD_WITH_QT6 ON CACHE BOOL "" FORCE) set(BUILD_TEST_APPLICATION OFF CACHE BOOL "" FORCE) set(BUILD_TRANSLATIONS OFF CACHE BOOL "" FORCE) set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) FetchContent_Declare(qtkeychain GIT_REPOSITORY https://github.com/frankosterfeld/qtkeychain.git GIT_TAG v0.14.0) FetchContent_MakeAvailable(qtkeychain) # Qwt 6.2(二维科学图表:数据集详情散点/等值线图)。见 cmake/qwt.cmake 说明。 # 源码 external/qwt-src 已 gitignore,需按 docs/ENV_SETUP 拉取。 if(EXISTS "${CMAKE_SOURCE_DIR}/external/qwt-src/src") include("${CMAKE_SOURCE_DIR}/cmake/qwt.cmake") endif() # vendored 3DGPRViewer 数据生成链(原样拷贝,算法零改动):geopro_gpr3dv 静态库。 # 链:多通道 .iprh/.iprb → GPRDataModel 立方体 → RadarProcessor 处理。生产管线 A 地基。 add_subdirectory(external/gpr3dviewer) add_subdirectory(src) # POC-B headless 度量 CLI(gpr_poc)。链 io_gpr/core/store/render,在真实数据上跑端到端度量。 add_subdirectory(tools/gpr_poc) # gpr3dv 冒烟 CLI:走 vendored 原版 API(loadImpulseMultiChannel → buildVolumeData → runPipeline)。 add_subdirectory(tools/gpr3dv_smoke) enable_testing() add_subdirectory(tests)