55 lines
2.0 KiB
CMake
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()
|