c++oding="utf-8" ?>
conan不直接设置c++标准,c++标准由cmake控制;cmakelists.txt中需显式设set(cmake_cxx_standard 17)等,conan profile中compiler.cppstd仅作参考且可能被覆盖。

Conan 本身不直接设置 C++ 标准,C++ 标准由 CMake 控制
Conan 不负责编译器语言标准(如 c++17、c++20)的设定,它只传递构建上下文(比如编译器路径、架构、build_type)给 CMake。真正控制 -std=... 的是 CMake —— 具体在 CMakeLists.txt 中用 set(CMAKE_CXX_STANDARD ...) 或 target_compile_features()。
CMakeToolchain 会继承 Conan profile 中的 compiler.cppstd,但仅作参考
Conan 的 CMakeToolchain 生成器会把当前 profile 里声明的 compiler.cppstd 写入 conan_toolchain.cmake,但它默认**不强制覆盖**你在 CMakeLists.txt 中的设置。它的作用更偏向“提示”或“兜底”,实际生效仍取决于你是否启用相关逻辑:
- 如果你在 profile 中设置了
compiler.cppstd=17,且CMakeToolchain生成了set(CMAKE_CXX_STANDARD 17),但你在CMakeLists.txt里又写了set(CMAKE_CXX_STANDARD 20),后者会覆盖前者 -
CMakeToolchain默认不会插入target_compile_features(),也不会自动加-std=...到每个 target;它只影响全局CMAKE_CXX_STANDARD - 若你依赖
find_package()找到的第三方库(如fmt)也要求特定标准,它们的config.cmake文件通常会检查CMAKE_CXX_STANDARD并报错(例如 fmt 要求 ≥17)
正确做法:CMakeLists.txt 中显式声明 + profile 中同步维护
为避免构建失败或行为不一致,应同时做两件事:
- 在
CMakeLists.txt开头明确写:set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF)
- 在 Conan profile(如
~/.conan2/profiles/default)中补上对应行:[settings] os=linux arch=x86_64 compiler=gcc compiler.version=12 compiler.libcxx=libstdc++11 compiler.cppstd=17
- 运行
conan install时确保使用该 profile:conan install . -pr=default -if=build - 如果项目需多标准(如部分 target 用 c++20),不要依赖 toolchain 统一设,改用
target_compile_features()和target_compile_options()按 target 设置
容易踩的坑:cppstd 不匹配导致链接或编译失败
最常见问题是 Conan 下载的预编译二进制包(如 fmt/10.2.1)是按某个 cppstd 构建的,而你的 CMake 用了不同标准:
- 现象:
undefined reference to `fmt::v10::format(...)`,或模板实例化失败 - 原因:GCC/Clang 对
std::string_view、std::span等类型的 ABI 在不同-std=下可能不兼容 - 验证方式:检查
build/generators/conan_toolchain.cmake是否含CMAKE_CXX_STANDARD,再对比conan list --graph=graph.json中各包的cppstd设置 - 修复关键:确保 profile 中的
compiler.cppstd、CMakeLists.txt 中的CMAKE_CXX_STANDARD、以及你调用的第三方库文档要求的标准三者一致
compiler.cppstd 的默认值可能变化。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











