centos 7 默认不带 clang,直接 yum install clang 只能装到老旧的 clang-3.4.2,缺乏 c++14/17 支持;推荐按需选择:基础编译用 epel(含 clang 但无 clang-format),现代 c++ 项目用 scl(如 llvm-toolset-11,含完整工具链且版本对齐),仅当需 llvm 15+ 等特例才源码编译。

CentOS 7 默认不带 clang,直接 yum install clang 能装上,但版本老旧(比如 clang-3.4.2),很多 C++14/17 特性不支持,项目里一用就报错。得按实际需求选方案:要快、稳、兼容老项目,走 EPEL;要新版特性或配套 clang-format,必须走 SCL;真要最新版(比如 LLVM 15+),才考虑源码编译。
EPEL 安装 clang(适合基础编译需求)
这是最轻量的方案,适合只需要 clang 命令跑通 C/C++ 编译、不依赖新标准或配套工具的场景。
- 先装 EPEL 源:
yum install -y epel-release - 再装 clang:
yum install -y clang - 验证:
clang --version通常输出类似clang version 3.4.2 (tags/RELEASE_34/dot2-final)
注意:这个版本不带 clang++ 独立命令(它只是 clang 的 symlink),也不含 clang-format、clang-tidy。如果 Makefile 或 CI 脚本里写了 clang++,它能运行;但若调用了 clang-format -i,会提示 command not found。
SCL 安装 llvm-toolset(推荐用于现代 C++ 项目)
需要 C++17、模块(Modules)、或配套格式化/静态分析工具时,必须用 Software Collections 提供的 llvm-toolset。它把新版 LLVM 工具链隔离在独立环境里,不影响系统默认 GCC。
Clang 22.1.3 Windows 64 位历史版本安装包,适合旧项目兼容、LLVM/Clang 工具链回退、编译行为对比、链接问题复现和 C/C++ 构建环境维护。
- 启用 SCL:
yum install -y centos-release-scl - 查可用版本:
yum search clang-format | grep llvm-toolset(常见有llvm-toolset-9、llvm-toolset-11) - 安装完整工具集(含 clang、clang++、clang-format、clang-tidy):
yum install -y llvm-toolset-11 - 启用环境:
scl enable llvm-toolset-11 bash(或写入/etc/profile.d/llvm.sh)
装完后 which clang 指向 /opt/rh/llvm-toolset-11/root/usr/bin/clang,clang --version 显示 11.x。注意:每次新开 shell 都要 scl enable,否则找不到命令;CI 中建议用 scl enable llvm-toolset-11 -- clang++ -std=c++17 ... 显式调用。
源码编译 clang(仅当 SCL 无对应版本时)
比如你要 LLVM 16、或打过定制 patch、或目标机器不能联网——这时才动手编译。它耗时长(2 小时起)、占空间(构建目录常超 10GB)、容易卡在依赖上。
- 必须装高版本 GCC(≥7.3)和 Python(≥3.6):
yum install -y devtoolset-7-gcc-c++ python3-devel - 用
devtoolset-7编译:scl enable devtoolset-7 -- bash,再执行 cmake - CMake 参数别漏掉
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra",否则没clang-format - 编译前务必设
export CC=/opt/rh/devtoolset-7/root/usr/bin/gcc和CXX=/opt/rh/devtoolset-7/root/usr/bin/g++,不然可能混用系统旧 GCC 导致链接失败
编译完 make install 默认装到 /usr/local,但要注意 /usr/local/bin 是否在 $PATH 前置位;更稳妥的是用 -DCMAKE_INSTALL_PREFIX=/opt/llvm-16 自定义路径,避免污染系统。
真正麻烦的不是装不上,而是装完后命令找不到、版本不对、或者 clang++ 和 clang-format 不同源导致行为不一致。SCL 方案看似多一步 scl enable,但它把整个工具链版本对齐了,省去后期排查隐性兼容问题的时间。










