系统级默认版本切换靠update-alternatives,项目级编译器指定靠构建系统参数或环境变量;ubuntu/debian上用该工具管理clang/clang++是最稳妥的系统级切换方式,需为二者绑定同一组配置并设置不同优先级,再通过--config命令选择,且cmake等构建系统可覆盖其设定。

系统级默认版本切换靠 update-alternatives,项目级编译器指定靠构建系统参数或环境变量——别混用,否则会冲突。
Ubuntu/Debian 上用 update-alternatives 管理 clang/clang++
这是最稳妥的系统级切换方式,适用于命令行直接调用 clang 或 clang++ 的场景(比如 make 不显式指定编译器时)。
- 先确认已安装多个版本:
ls /usr/bin/clang*应能看到类似clang-10、clang-13、clang++-10、clang++-13 - 为
clang注册版本(需 root 权限):sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-13 100 - 再注册
clang++并绑定到同一组(关键!否则clang和clang++版本不一致):sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-13 100 --slave /usr/bin/clang++ clang++ /usr/bin/clang++-13 - 添加低优先级版本(如
clang-10)时,优先级必须严格小于已有项(比如设为90),否则--config clang切换时不会显示它 - 切换命令:
sudo update-alternatives --config clang,选编号后,clang -v和clang++ -v会同步生效
CMake 项目里指定 clang 版本
构建系统优先级高于系统默认值。如果你在 CMake 中硬编码了编译器路径,update-alternatives 就完全不起作用。
Clang 22.1.3 Windows 64 位历史版本安装包,适合旧项目兼容、LLVM/Clang 工具链回退、编译行为对比、链接问题复现和 C/C++ 构建环境维护。
- 最常用方式:CMake 配置时传参,例如:
cmake -DCMAKE_C_COMPILER=clang-13 -DCMAKE_CXX_COMPILER=clang++-13 .. - 也可在
CMakeLists.txt开头设置(不推荐,污染项目):set(CMAKE_C_COMPILER "clang-13") - 注意:CMake 缓存中一旦写入编译器路径,后续
cmake ..不加参数不会刷新;要重置就得删掉build/目录或运行cmake -U - 如果项目用了
find_program()查找 clang,确保PATH里高优先级版本在前,否则可能找到旧版
临时切换:用环境变量覆盖
适合单次构建或 CI 场景,不影响系统状态,也绕过 CMake 缓存问题。
- 直接生效:
CC=clang-13 CXX=clang++-13 cmake .. - 或者导出后再运行:
export CC=clang-13; export CXX=clang++-13; cmake .. - 注意:某些项目(如 ClickHouse)会检查
CC/CXX,但有些只认CMAKE_C_COMPILER,得看具体构建逻辑 - 别把
CC设成clang(无版本号),否则仍走update-alternatives选中的默认版本,可能不是你想要的
真正容易被忽略的是:Clang 版本切换后,配套的 libclang、clang-tidy、clang-format 往往不同步——它们不是通过 update-alternatives 统一管理的,得单独确认路径和版本是否匹配。










