conan install 必须显式指定 clang 编译器配置,因其不自动识别系统 clang 软链接或 update-alternatives 设置;需通过 -s compiler=clang -s compiler.version=13 -s compiler.libcxx=libc++ -s compiler.cppstd=20 等参数或 profile 文件精确声明,否则易导致 abi 不匹配、链接失败或运行时崩溃。

Conan install 时必须显式传入 Clang 编译器配置
Conan 不会自动读取系统 clang 或 clang++ 的软链接或 update-alternatives 设置。它只认你通过 -s(setting)参数明确指定的编译器信息。漏掉这一步,Conan 就会按默认规则(通常是 GCC 或系统 fallback)选编译器,导致下载的二进制包 ABI 不匹配、链接失败或运行时崩溃。
常见错误现象包括:
ERROR: Missing binary for fmt/10.2.1: ... clang-13 not found in remotes- 构建成功但运行时报
undefined symbol: _ZTVNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEE(典型 libc++ / libstdc++ 混用) -
conan install下载了gcc构建的包,而你用clang++编译主项目,链接时报undefined reference to 'operator new'
正确做法是每次运行 conan install 时都带上完整的编译器 setting:
-
-s compiler=clang:固定写死为clang,不能写clang-13或clang++ -
-s compiler.version=13:版本号必须是数字,不能带点号(如13.0会报错) -
-s compiler.libcxx=libc++或libstdc++11:关键!必须与你实际链接的 C++ 标准库一致;Clang 默认用libc++,但很多 Linux 发行版预装的是libstdc++ -
-s compiler.cppstd=17或20:建议显式指定,避免不同 profile 解析不一致
完整命令示例:
conan install .. --build=missing -s compiler=clang -s compiler.version=13 -s compiler.libcxx=libc++ -s compiler.cppstd=20
profile 文件里定义 Clang 配置更安全
把编译器 setting 写进 profile 文件,比每次都敲长命令更可靠——尤其当你需要在 CI 或多台机器复现相同环境时。Conan 的 profile 是纯文本,放在 ~/.conan2/profiles/ 下,文件名任意(如 clang13-libc++)。
profile 文件内容需包含三部分:
-
[settings]:必须包含compiler=clang、compiler.version、compiler.libcxx、compiler.cppstd -
[conf](可选):用于控制工具链行为,例如tools.cmake.cmaketoolchain:user_toolchain=/path/to/clang-toolchain.cmake -
[env](极少用):仅当需要覆盖 PATH 或强制CC/CXX环境变量时才加,一般不需要
一个最小可用的 clang13-libc++ profile 示例:
[settings] os=Linux arch=x86_64 compiler=clang compiler.version=13 compiler.libcxx=libc++ compiler.cppstd=20 [conf] tools.cmake.cmaketoolchain:generator=Ninja
使用方式:
Clang 22.1.3 Windows 64 位历史版本安装包,适合旧项目兼容、LLVM/Clang 工具链回退、编译行为对比、链接问题复现和 C/C++ 构建环境维护。
conan install .. --profile:build=clang13-libc++ --profile:host=clang13-libc++ --build=missing
CMakeLists.txt 中别依赖 Conan 自动推导编译器
即使你在 conan install 里指定了 Clang,CMake 本身仍可能用系统默认编译器(比如 /usr/bin/gcc)。Conan 生成的 CMakeToolchain 只负责传递 setting,不会重写 CMAKE_C_COMPILER —— 这事得你手动做。
正确做法是在 CMake 配置阶段显式指定:
- 用
cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++启动 - 或者在
CMakeLists.txt开头加判断(不推荐,污染源码):if(NOT CMAKE_C_COMPILER_ID STREQUAL "Clang") message(FATAL_ERROR "This project requires Clang, but ${CMAKE_C_COMPILER_ID} is used") endif()
更稳妥的方式是把编译器路径也写进 profile 的 [conf] 段,然后让 CMakeToolchain 自动注入:
[conf]
tools.build:compiler_executables={"c": "/usr/bin/clang-13", "cpp": "/usr/bin/clang++-13"}
这样 conan install 生成的 toolchain 文件里就会包含 set(CMAKE_C_COMPILER "/usr/bin/clang-13"),CMake 就不会跑偏。
Clang 版本和 libc++ 必须严格匹配
这是最容易被忽略的兼容性雷区。Clang 13 二进制包如果用了 libc++13 编译,而你的系统只有 libc++12 或 libc++14,运行时大概率崩溃。反过来,如果你本地装的是 libc++14,但 Conna 包是用 libc++13 构建的,std::string 的内存布局可能不一致。
验证方式:
- 查你系统装的
libc++版本:clang++-13 --print-file-name=libc++.so(输出路径后看符号链接指向) - 查 Conan 包声明的 libc++ 版本:
conan inspect fmt/10.2.1 -a settings.compiler.libcxx - 确保两者一致;如果不一致,要么升级系统 libc++,要么换用对应 libc++ 版本的 Conan profile
Clang 本身不自带 libc++,它依赖系统或 LLVM 安装包提供的 libc++。Ubuntu 上通常通过 sudo apt install libc++1-13 libc++1-13-dev 安装,macOS 上随 Xcode Command Line Tools 提供,Windows 上需从 LLVM 官网下载完整包。










