Windows+VS2019+CMake+CLion+Conan环境如何启用C++20修复Abseil编译报错
核心问题原因
你遇到的是MSVC编译器的默认行为问题:MSVC出于旧代码兼容考虑,默认不会更新__cplusplus宏的取值,即使你已经通过CMake开启了C20标准,该宏的默认返回值仍然是199711L,无法触发Abseil代码中__cplusplus >= 201703L的判断分支,导致代码尝试引用C20已经移除的std::result_of。
解决方案
- 给MSVC添加
/Zc:__cplusplus编译参数,让编译器返回正确的__cplusplus数值。在你现有CMakeLists.txt的set(CMAKE_CXX_STANDARD_REQUIRED ON)行后添加以下配置:
if (MSVC) add_compile_options(/Zc:__cplusplus) endif()
- 清理原有CMake缓存:删除你项目的build目录,重新执行CMake配置、生成操作,确保新的编译参数生效。
- 重新编译Conan依赖包:如果你的Abseil包是之前以低于C20的标准编译安装的,需要清理Conan中对应的缓存包,重新以C20标准安装所有依赖,避免后续出现兼容性问题。
配置完成后可以在代码中加入std::cout << __cplusplus << std::endl;验证,C++20下输出值应为202002L,即代表配置生效。
内容的提问来源于stack exchange,提问作者mpen
相关产品推荐
相关产品推荐

