branch_switcher/cmake/project_cpp_standard.cmake
daiqingshuang 6eb14af6e1 init
2025-04-10 18:29:49 +08:00

55 lines
2.0 KiB
CMake

function(set_cpp_standard standard)
# 参数验证
set(VALID_STANDARDS 11 14 17 20 23)
if(NOT ${standard} IN_LIST VALID_STANDARDS)
message(WARNING "非标准 C++ 版本: ${standard},支持的版本有: ${VALID_STANDARDS}")
endif()
# 指定需要的 C++ 标准,设置到父作用域
set(CMAKE_CXX_STANDARD ${standard} PARENT_SCOPE)
# 强制要求此标准,如果编译器不支持则配置时报错
set(CMAKE_CXX_STANDARD_REQUIRED ON PARENT_SCOPE)
# 可选:禁用编译器特定的扩展,使用纯粹的标准
set(CMAKE_CXX_EXTENSIONS OFF PARENT_SCOPE)
if(MSVC)
# 设置utf-8编码
add_compile_options(/utf-8)
# 强制 MSVC 正确设置 __cplusplus 宏
add_compile_options(/Zc:__cplusplus)
# 可选:增加 MSVC 警告级别
add_compile_options(/W4)
# 可选: 启用 UNICODE 支持
add_definitions(-DUNICODE -D_UNICODE)
endif()
if(WIN32)
# 可选:添加 WIN32_LEAN_AND_MEAN 以减少 Windows 头文件包含
add_definitions(-DWIN32_LEAN_AND_MEAN)
endif()
# GCC/Clang 特定选项
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra)
# 禁用未使用参数的警告
add_compile_options(-Wno-unused-parameter)
# 根据 C++ 标准添加特定选项
if(${standard} GREATER 14) # 更兼容的写法,避免使用 GREATER_EQUAL
add_compile_options(-Wshadow -Wnon-virtual-dtor)
endif()
endif()
# 如果是MinGW, 并且使用了C++17或更高版本, 则添加libstdc++exp库
if(MINGW)
message(STATUS "检测到MinGW编译器")
# 更兼容的版本比较
if(${standard} GREATER 14) # C++17及以上
message(STATUS "为C++${standard}添加libstdc++exp库支持")
link_libraries(-lstdc++exp)
endif()
endif()
message(STATUS "已设置C++${standard}标准")
endfunction()