clang/llvm是独立于gcc的编译工具链,非升级替代;ubuntu/debian用apt装clang+libc++-dev,centos 7需启用scl装llvm-toolset-7-clang并显式加-stdlib=libc++链接c++17标准库,否则因abi不匹配报undefined reference。

直接用包管理器装,别源码编译——除非你明确需要某个未发布的特性或调试 LLVM 本身。源码编译耗时长、易卡在 llvm-tblgen、依赖版本敏感,日常开发纯属自找麻烦。
Ubuntu/Debian:用 apt 装 clang + libc++
Clang 和 GCC 是两套独立工具链,不能混用标准库。只装 clang 不够,必须同步装 LLVM 官方 C++ 库:
sudo apt update && sudo apt install clang libc++-dev libc++1- 验证:
clang --version和clang++ --version输出应一致;若仍显示旧版(如 3.4.2),说明没走新源,可能系统默认源太老 - 想装新版(比如 Clang-18)?运行官方脚本:
wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && sudo ./llvm.sh 18
CentOS/RHEL:注意 SCL 和 llvm-toolset 版本匹配
CentOS 7 和 RHEL 7 必须启用 Software Collections(SCL),否则 yum install clang 拿到的是系统自带的过时版本(Clang 3.4):
- CentOS 7:
sudo yum install centos-release-scl && sudo yum install llvm-toolset-7-clang(对应 Clang 5.0,仅基础可用) - RHEL 8+ 或 CentOS 8+:
sudo dnf install clang llvm-toolset(原生支持,无需 SCL) - 装完后必须手动启用:
scl enable llvm-toolset-7 bash(否则clang++仍调用老 ABI)
clang++ 编译 C++17 项目时 undefined reference 怎么办
这不是 bug,是设计行为:clang++ 默认仍链接 GCC 的 libstdc++,但头文件路径和 ABI 不对齐,尤其遇到 std::string_view、std::optional 这类 C++17 新类型时直接报符号未定义。
- 必须显式指定标准库:
clang++ -stdlib=libc++ test.cpp - 漏掉
-stdlib=libc++,clang++ 就只是个“长得像 GCC 的前端”,C++14/17 特性基本不可用 - 如果用了 CMake,加这行:
set(CMAKE_CXX_STANDARD_LIBRARIES "-stdlib=libc++"),或更稳妥地在cmake命令里传:-DCMAKE_CXX_FLAGS="-stdlib=libc++"
让 cmake / make 默认走 clang,但不破坏系统 gcc
千万别改 /usr/bin/gcc 符号链接——rpm-build、内核模块编译、很多系统工具都硬依赖原生 GCC,一动就崩。
- 临时切换:
CC=clang CXX=clang++ make - CMake 项目:
cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .. - 用户级长期生效(仅影响当前用户 shell):
echo 'export CC=clang' >> ~/.bashrc && echo 'export CXX=clang++' >> ~/.bashrc
最容易被忽略的一点:Clang 和 libc++ 是绑定关系,不是“装了 clang 就自动配好一切”。-stdlib=libc++ 不是可选项,是功能开关;而 libc++-dev 包不装,连头文件都没有,编译直接失败。











