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()