conan本身不决定c++标准版本,真正控制-std=c++20等标志的是构建系统(如cmake)和conan生成的cmaketoolchain;必须在conan install时显式指定-s compiler.cppstd=c++20,并确保cmake正确加载toolchain文件且置于project()之前,同时所有依赖包均需兼容该标准以避免abi不一致。

Conan 本身不决定 C++ 标准版本,它只负责把依赖库按你指定的编译器设置构建出来;真正控制 -std=c++20 这类标志的是你的构建系统(如 CMake)和 Conan 的 CMakeToolchain 生成逻辑。关键不是“Conan 适配标准”,而是你如何让 Conan 生成的 toolchain 文件把 C++ 标准正确传给编译器。
conan install 时必须显式声明 compiler.cppstd
Conan 默认不会自动推导你要用的 C++ 标准,哪怕你在 CMakeLists.txt 里写了 set(CMAKE_CXX_STANDARD 20),Conan 生成的 conan_toolchain.cmake 也不会读取它——它只认自己收到的 settings。如果你跳过这步,最终编译器很可能用默认标准(比如 GCC 12 默认 c++17),导致 std::format 或概念(concept)报错。
- 运行
conan install时必须加-s compiler.cppstd=c++20(或c++23) - 这个 setting 必须和你 CMake 中实际要求的标准一致,否则链接或 ABI 可能出问题
- 不同编译器对
cppstd值的支持有差异:MSVC 用14/17/20,GCC/Clang 用c++14/c++17/c++20 - 如果用了 profile(比如
~/.conan2/profiles/default),可以直接在里面写[settings]块,避免每次命令都输
CMakeToolchain 生成的 toolchain 文件必须被 CMake 正确加载
很多人在 CMakeLists.txt 里写了 include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake),但忘了这行必须放在 project() 之前——否则 CMake 已经用默认标准初始化过了,toolchain 里的 CMAKE_CXX_STANDARD 设置就失效了。
- 正确顺序:
cmake_minimum_required()→include(.../conan_toolchain.cmake)→project() - 路径要对:Conan 默认把
conan_toolchain.cmake放在执行conan install的当前目录(通常是 build 目录),所以${CMAKE_BINARY_DIR}是对的 - 别手写
set(CMAKE_CXX_STANDARD 20)在project()后面——它会覆盖 toolchain 的设置,造成不一致
第三方包是否支持你选的 C++ 标准?
就算你本地设了 c++20,如果某个依赖包(比如旧版 spdlog/1.11.0)的 Conan 配方(recipe)没声明支持 c++20,它的编译可能失败,或者静默降级到 c++17,导致你代码里用的 std::ranges::sort 找不到符号。
- 查配方是否支持:看包的
conandata.yml或其 GitHub repo 的conanfile.py,搜索cppstd或compatible_packages - 优先选较新版本的包(如
spdlog/1.13.0),它们通常已更新cppstd兼容性声明 - 若必须用老包,可临时 patch:在
conanfile.txt里加[options]块,强制传递somepkg:cppstd=c++20(前提是该包 recipe 接受此 option) - 注意:
compiler.cppstd是全局 setting,影响所有依赖;而pkg:cppstd是 per-package option,仅当 recipe 显式支持时才生效
最易忽略的一点:C++ 标准变更会改变 ABI(尤其涉及 std::string、std::vector 的内存布局),所以一旦你设了 c++20,所有依赖(包括 transitive ones)都必须用同一 cppstd 构建,不能混用。Conan 的 conan.lock 文件会记录这个 setting,但 CI 环境下若忘记传 -s compiler.cppstd=...,就可能复现失败。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











