直接用包管理器安装Clang最稳妥:Ubuntu/Debian需同时装clang与libc++-dev以支持C++17特性,CentOS 7须启用SCL并安装llvm-toolset-7-clang,且clang++编译必须显式加-stdlib=libc++,否则因ABI不匹配报undefined reference。

直接用包管理器装 Clang 是最稳的,别碰源码编译——除非你真需要某个特定 commit 或调试 LLVM 本身。
Ubuntu/Debian 系统:装 clang + libc++ 两步到位
系统自带的 apt 源里有现成包,但只装 clang 不够,C++ 项目大概率链接失败:
- 必须同时装
libc++-dev(LLVM 官方 C++ 标准库头文件和静态库) - 如果只装
clang,clang++默认仍会去找libstdc++,而老版本(如 GCC 4.8 自带的)压根没有std::string_view、std::optional等 C++17 符号 - 验证是否装全:
clang++ --version和ls /usr/include/c++/v1/都得能跑通
命令示例:
sudo apt update sudo apt install clang libc++-dev libc++1
CentOS/RHEL 系统:注意 SCL 和版本对齐
CentOS 7 和 RHEL 7 必须启用 Software Collections(SCL),否则 yum install clang 装出来的是过时的 3.4.2 版本,连 -std=c++14 都不支持:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 先启用 SCL:
sudo yum install centos-release-scl - 再装工具集:
sudo yum install llvm-toolset-7-clang(对应 Clang 5.0,仅基础可用) - RHEL 8+ 已原生支持:
sudo dnf install clang llvm-toolset,无需额外启用 SCL - 装完务必检查:
clang++ --version输出应含llvm-toolset-7或类似标识,否则说明没生效
装完 clang++ 为什么还报 undefined reference?
这是最常被跳过的一步:Clang 编译器本身不自动选标准库,clang++ 默认行为是“假装自己是 GCC”,静默 fallback 到系统 libstdc++,但 ABI 和符号表不匹配:
- 编译 C++14/17 项目时,必须显式加
-stdlib=libc++,例如:clang++ -stdlib=libc++ -std=c++17 main.cpp - 漏掉这个参数,错误信息往往是
undefined reference to `std::string::size()'这类看似“基础函数都找不到”的提示 - 不是所有项目都能加这个参数——如果你依赖某个只适配
libstdc++的第三方库(比如某些 CUDA 工具链),就得换回g++或手动桥接
怎么让 cmake 或 make 默认用 clang?别动 /usr/bin/gcc 符号链接
硬改系统级符号链接会破坏 rpm-build、内核模块编译等底层工具,正确做法是环境变量隔离:
- 临时单次构建:
CC=clang CXX=clang++ make - CMake 项目:
cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .. - 用户级默认(谨慎):
echo 'export CC=clang' >> ~/.bashrc && echo 'export CXX=clang++' >> ~/.bashrc,但记得 reload:source ~/.bashrc
多版本共存时,update-alternatives 可以管理 /usr/bin/clang 的软链指向,但别把它和系统默认 gcc 混为一谈——它们属于不同工具链,ABI、标准库、调试信息格式都不互通。

















