更新:1、升级编译器版本至MSVC2022,升级C++至C++17;
Signed-off-by: waiwaylee <waiwaylee@foxmail.com>
This commit is contained in:
+53
-15
@@ -1,8 +1,13 @@
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
cmake_minimum_required(VERSION 3.21)
|
||||
|
||||
# 雷达数据处理动态链接库
|
||||
# 开发环境已由 Qt/qmake 迁移到 VS Code + CMake。
|
||||
# 编译器保持为 Microsoft Visual C++ Compiler 12.0 (x86)。
|
||||
# 编译器已由 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)
|
||||
|
||||
# 扫描模式:
|
||||
@@ -16,6 +21,33 @@ if(NOT RADAR_SCAN_MODE STREQUAL "PHASE_SCANNING" AND NOT RADAR_SCAN_MODE STREQUA
|
||||
message(FATAL_ERROR "RADAR_SCAN_MODE 必须为 PHASE_SCANNING 或 MECHANICAL_SCANNING,当前值:${RADAR_SCAN_MODE}")
|
||||
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")
|
||||
@@ -69,25 +101,31 @@ target_include_directories(data_process_class_dll PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/data_process_class_dll
|
||||
)
|
||||
|
||||
# 原工程使用 MSVC 2013(Visual Studio 12)编译器;保持兼容,不强制更高 C++ 标准。
|
||||
# 源码使用 C++11 特性(nullptr、类内成员初始化等),MSVC 2013 默认即可支持。
|
||||
|
||||
if(MSVC)
|
||||
# 与原 qmake 生成的编译选项保持一致。
|
||||
# 注意:MSVC 2013 的 Debug 运行库与 /Zc:strictStrings 同时使用会触发 STL 编译错误,
|
||||
# 原 qmake 工程也仅在 Release 配置中使用该选项。
|
||||
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
|
||||
$<$<CONFIG:Release>:/Zc:strictStrings>
|
||||
)
|
||||
|
||||
# 修复 C4819(源文件含当前代码页无法表示的字符)。
|
||||
# /utf-8 从 VS2015 Update 2 开始支持;本工程使用 MSVC 2013 时无该选项,
|
||||
# 通过为源码文件添加 UTF-8 BOM 解决 C4819,这里仅对支持 /utf-8 的新版 MSVC 开启。
|
||||
if(MSVC_VERSION GREATER_EQUAL 1900)
|
||||
target_compile_options(data_process_class_dll PRIVATE /utf-8)
|
||||
endif()
|
||||
# 与原 qmake 生成的编译选项保持一致:Release 配置额外开启严格字符串字面量检查。
|
||||
# (原 MSVC 2013 因 Debug 运行库与 /Zc:strictStrings 冲突而仅限 Release,
|
||||
# 升级到 MSVC 2022 后该限制已不存在,此处仍沿用“仅 Release”以保持行为不变。)
|
||||
target_compile_options(data_process_class_dll PRIVATE
|
||||
$<$<CONFIG:Release>:/Zc:strictStrings>
|
||||
)
|
||||
endif()
|
||||
|
||||
# 输出目录:build/bin 下为 DLL/PDB,build/lib 下为导入库。
|
||||
|
||||
Reference in New Issue
Block a user