cmake_minimum_required(VERSION 3.21) # 雷达数据处理动态链接库 # 开发环境已由 Qt/qmake 迁移到 VS Code + CMake。 # 编译器已由 Microsoft Visual C++ Compiler 12.0 (VS2013) 升级为 # Microsoft Visual C++ Compiler 2022(v143 工具集,_MSC_VER 19.4x,x64)。 # 语言标准同步提升为 C++17。 # # 注意:VS2022 生成器("Visual Studio 17 2022")需要 CMake >= 3.21, # 因此本工程的最低 CMake 版本随之提高;NMake/Ninja 生成器同样满足。 project(data_process_class_dll LANGUAGES CXX) # 扫描模式: # PHASE_SCANNING -> 相扫雷达(X256_PS,原 Qt 工程默认激活配置) # MECHANICAL_SCANNING -> 机扫雷达(X256_MS) # 用法:cmake -S . -B build -DRADAR_SCAN_MODE=PHASE_SCANNING set(RADAR_SCAN_MODE "PHASE_SCANNING" CACHE STRING "Radar scan mode (PHASE_SCANNING or MECHANICAL_SCANNING)") set_property(CACHE RADAR_SCAN_MODE PROPERTY STRINGS PHASE_SCANNING MECHANICAL_SCANNING) if(NOT RADAR_SCAN_MODE STREQUAL "PHASE_SCANNING" AND NOT RADAR_SCAN_MODE STREQUAL "MECHANICAL_SCANNING") message(FATAL_ERROR "RADAR_SCAN_MODE 必须为 PHASE_SCANNING 或 MECHANICAL_SCANNING,当前值:${RADAR_SCAN_MODE}") endif() # --------------------------------------------------------------------------- # 数据记录调试功能开关(可选编译,详见 docs/data_record_debug.md) # AUTO : Debug 构建启用、Release 构建关闭(默认;交付构建不做任何记录) # ON : 强制启用(可用于 Release 排查,需自行承担性能开销) # OFF : 强制关闭 # 启用时新增独立静态库 rdp_record:以 C++20 编译(ormpp 要求)、编译内置的 sqlite3 # amalgamation,并链接进 DLL;源码中的 RDP_RECORD 宏由 RDP_RECORD_ENABLE 控制,关闭时 # 展开为空操作(实参不求值),记录模块完全不参与编译。 # 依赖来源与升级方式见 third_party/ormpp/UPSTREAM.md。 # --------------------------------------------------------------------------- set(RDP_DATA_RECORD "AUTO" CACHE STRING "数据记录调试功能:AUTO(Debug=ON/Release=OFF) / ON / OFF") set_property(CACHE RDP_DATA_RECORD PROPERTY STRINGS AUTO ON OFF) if(RDP_DATA_RECORD STREQUAL "AUTO") if(CMAKE_CONFIGURATION_TYPES) message(FATAL_ERROR "多配置生成器下 RDP_DATA_RECORD=AUTO 无法判定,请显式传入 ON 或 OFF") elseif(CMAKE_BUILD_TYPE STREQUAL "Debug") set(RDP_RECORD_ENABLED TRUE) else() set(RDP_RECORD_ENABLED FALSE) endif() elseif(RDP_DATA_RECORD STREQUAL "ON") set(RDP_RECORD_ENABLED TRUE) elseif(RDP_DATA_RECORD STREQUAL "OFF") set(RDP_RECORD_ENABLED FALSE) else() message(FATAL_ERROR "RDP_DATA_RECORD 必须为 AUTO / ON / OFF,当前值:${RDP_DATA_RECORD}") endif() if(RDP_RECORD_ENABLED) message(STATUS "数据记录调试功能:启用(C++20 静态库 rdp_record + 内置 SQLite)") else() message(STATUS "数据记录调试功能:关闭(不编译记录模块,RDP_RECORD 为空操作)") endif() # --------------------------------------------------------------------------- # 语言标准:C++17 # --------------------------------------------------------------------------- # CMAKE_CXX_STANDARD 由 CMake 转换为 MSVC 的 /std:c++17(CMake >= 3.10 起支持)。 # CMAKE_CXX_EXTENSIONS OFF 在 MSVC 下没有对应开关(只影响 GCC/Clang 的 -std=gnu++xx), # 保留它是为了在换用其它编译器时同样不启用语言扩展。 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # --------------------------------------------------------------------------- # 编译器约束:必须使用 MSVC 2022(v143,_MSC_VER >= 1930) # --------------------------------------------------------------------------- if(NOT MSVC) message(FATAL_ERROR "本工程仅支持 MSVC (cl.exe) 编译器,当前编译器:${CMAKE_CXX_COMPILER_ID}") endif() if(MSVC_VERSION LESS 1930) message(FATAL_ERROR "本工程要求 MSVC 2022 (v143) 及以上版本(_MSC_VER >= 1930)," "当前 _MSC_VER=${MSVC_VERSION}(编译器:${CMAKE_CXX_COMPILER})。\n" "请先运行 VS2022 的 vcvarsall.bat x64(见 .vscode/scripts/msvc_env.bat)后再配置。") endif() message(STATUS "编译器:${CMAKE_CXX_COMPILER}(MSVC _MSC_VER=${MSVC_VERSION})") message(STATUS "C++ 标准:C++${CMAKE_CXX_STANDARD}") # 导出编译命令,便于 VS Code C/C++ 插件 IntelliSense 使用。 # Visual Studio 生成器不支持该选项,因此仅对 Makefile/Ninja 生成器开启。 if(NOT CMAKE_GENERATOR MATCHES "Visual Studio") set(CMAKE_EXPORT_COMPILE_COMMANDS ON) endif() set(SOURCES data_process_class_dll/rdp_log.cpp data_process_class_dll/data_process_class_dll.cpp data_process_class_dll/data_process.cpp data_process_class_dll/dot_coh.cpp data_process_class_dll/kalman.cpp data_process_class_dll/coor_trans.cpp data_process_class_dll/track_asso.cpp data_process_class_dll/track_init.cpp data_process_class_dll/track_index_mangement.cpp data_process_class_dll/tas_ctrl.cpp data_process_class_dll/track_die.cpp data_process_class_dll/dot_coh_tas.cpp data_process_class_dll/track_asso_tas.cpp data_process_class_dll/track_init_direct_tracking.cpp data_process_class_dll/track_die_tas.cpp ) set(PUBLIC_HEADERS data_process_class_dll/data_process_class_dll.h data_process_class_dll/data_process_class_dll_global.h ) add_library(data_process_class_dll SHARED ${SOURCES}) # --------------------------------------------------------------------------- # 数据记录模块(RDP_DATA_RECORD 启用时构建):独立静态库、C++20(ormpp 要求), # 与雷达处理代码(C++17)通过 rdp_record.h 的「仅声明 + 显式实例化」跨标准边界。 # --------------------------------------------------------------------------- if(RDP_RECORD_ENABLED) enable_language(C) # 用于编译 sqlite3 amalgamation add_library(rdp_record STATIC data_process_class_dll/rdp_record.cpp third_party/ormpp/thirdparty/sqlite3/sqlite3.c ) set_target_properties(rdp_record PROPERTIES CXX_STANDARD 20 CXX_STANDARD_REQUIRED ON ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" ) # RDP_RECORD_ENABLE 经 PUBLIC 传递给 DLL:data_process.cpp 等源码中的 RDP_RECORD 宏随之生效 target_compile_definitions(rdp_record PUBLIC RDP_RECORD_ENABLE ORMPP_ENABLE_SQLITE3 ) target_include_directories(rdp_record PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/data_process_class_dll PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/third_party/ormpp ${CMAKE_CURRENT_SOURCE_DIR}/third_party/ormpp/iguana ${CMAKE_CURRENT_SOURCE_DIR}/third_party/ormpp/ormpp ${CMAKE_CURRENT_SOURCE_DIR}/third_party/ormpp/thirdparty/sqlite3 ) target_compile_options(rdp_record PRIVATE /W3 /utf-8 /Zc:__cplusplus /FS ) # 第三方 amalgamation 单独降到 /w(源文件级选项在编译命令行中位于目标级之后,优先生效) set_source_files_properties(third_party/ormpp/thirdparty/sqlite3/sqlite3.c PROPERTIES COMPILE_OPTIONS "/w") target_link_libraries(data_process_class_dll PRIVATE rdp_record) endif() # 编译 DLL 时定义导出宏;引用 DLL 的工程不应定义该宏。 target_compile_definitions(data_process_class_dll PRIVATE DATA_PROCESS_CLASS_DLL_LIBRARY ${RADAR_SCAN_MODE} ) # 与 qmake 工程保持一致的 Windows 编译定义 if(WIN32) target_compile_definitions(data_process_class_dll PRIVATE WIN32 _WINDOWS _UNICODE UNICODE NOMINMAX ) endif() # Eigen 头文件位于源码目录下()。 target_include_directories(data_process_class_dll PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/data_process_class_dll ) if(MSVC) target_compile_options(data_process_class_dll PRIVATE # 显式恢复 /W3 警告级别。 # CMake 3.15(策略 CMP0092)起不再把 /W3 放进 CMAKE_CXX_FLAGS, # 而本工程此前(cmake_minimum_required 3.10)一直以 /W3 构建, # README 4.5 记录的全部 C4819/C4018/C4244 告警清理也基于该级别, # 因此这里显式指定,保持警告级别不变。 /W3 # MSVC 2022 完整支持 /utf-8(VS2015 Update 2 起), # 源码本身为 UTF-8 with BOM,显式指定后中文字符串/注释不再受系统代码页影响(消除 C4819)。 /utf-8 # 让 __cplusplus 正确报告 201703L(MSVC 默认始终为 199711L)。 # C++17 下依赖 __cplusplus 判断的第三方库(Eigen 3.3.7 等)据此走标准分支。 /Zc:__cplusplus /Zc:wchar_t # NMake 生成器下并行/增量编译时统一 PDB 写入。 /FS ) # 与原 qmake 生成的编译选项保持一致:Release 配置额外开启严格字符串字面量检查。 # (原 MSVC 2013 因 Debug 运行库与 /Zc:strictStrings 冲突而仅限 Release, # 升级到 MSVC 2022 后该限制已不存在,此处仍沿用“仅 Release”以保持行为不变。) target_compile_options(data_process_class_dll PRIVATE $<$:/Zc:strictStrings> ) endif() # 输出目录:build/bin 下为 DLL/PDB,build/lib 下为导入库。 set_target_properties(data_process_class_dll PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" PUBLIC_HEADER "${PUBLIC_HEADERS}" ) # 安装规则:DLL/导入库 -> bin/lib,公开头文件 -> include。 include(GNUInstallDirs) install(TARGETS data_process_class_dll RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )