clang安装后不会自动接管cc/c++等命令,需按场景配置:ubuntu用update-alternatives系统级切换;cmake项目推荐通过-d参数指定编译器;dev-c++需手动添加完整路径工具链并注意clang.exe自动识别语言。

Clang 安装后,clang 和 clang++ 默认不会自动接管系统默认的 cc、c++ 或 gcc、g++ 命令 —— 这是正常行为,不是安装失败。是否切换、怎么切换,取决于你用什么场景:命令行直接调用?CMake 构建?还是 Dev-C++ 这类 IDE?不同路径,操作完全不同。
Ubuntu/Debian 系统用 update-alternatives 切换全局默认
这是最稳妥的系统级切换方式,适用于终端里直接敲 clang、clang++,也影响 cc、c++ 符号链接(如果已配置)。
-
update-alternatives --display clang先查有没有已有配置;没输出说明还没注册 - 注册 Clang 版本(例如已装
clang-16):sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-16 100 --slave /usr/bin/clang++ clang++ /usr/bin/clang++-16 - 同样注册
cc和c++(可选但推荐):sudo update-alternatives --install /usr/bin/cc cc /usr/bin/clang-16 100 --slave /usr/bin/c++ c++ /usr/bin/clang++-16 - 执行
sudo update-alternatives --config clang手动选版本;--config cc同理 - 注意:优先级数字(如
100)越大越优先;多个版本共存时,靠它控制默认值
常见坑:clang++-16 存在但 clang-16 不存在?那是包没装全,补装 clang-16 包(不是只装 clang++-16)。
CMake 项目里指定 Clang 编译器
不改系统全局设置,只让当前项目用 Clang —— 这是最常用、最安全的做法,尤其多人协作或 CI 环境。
Clang 22.1.3 Windows 64 位历史版本安装包,适合旧项目兼容、LLVM/Clang 工具链回退、编译行为对比、链接问题复现和 C/C++ 构建环境维护。
- 不要在
CMakeLists.txt里硬写set(CMAKE_C_COMPILER "clang");这会污染所有构建,且无法覆盖命令行参数 - 正确做法是在运行
cmake时传参:cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .. - 如果要用特定版本(如
clang-15),直接写全名:cmake -DCMAKE_C_COMPILER=clang-15 -DCMAKE_CXX_COMPILER=clang++-15 .. - 路径必须绝对准确;若 Clang 不在
$PATH中,得写完整路径,比如/opt/llvm/bin/clang - 验证是否生效:构建后看 CMake 输出里的
-- The C compiler identification is Clang
容易忽略的点:CMake cache 文件(CMakeCache.txt)会记住上次的编译器,换编译器前最好删掉整个 build/ 目录,或加 -B build 指定新目录。
Dev-C++ 里添加并启用 Clang 配置
Dev-C++ 本身不内置 Clang 支持,必须手动添加工具链;它不读系统 update-alternatives 设置,也不认 $PATH,路径必须显式指定。
- 进
Tools → Compiler Options → Programs,点Add新建配置,起名如Clang 16 -
Compiler字段填clang.exe的**完整路径**(如C:\Program Files\LLVM\bin\clang.exe) -
Linker可填lld.exe(同目录下),或留空让 Dev-C++ 自动 fallback 到 MinGW 的ld -
Compiler Options加上-std=c17 -Wall -Wextra;C++ 项目加-std=c++20 - 切到
Compiler选项卡,从Compiler Set下拉菜单选刚建的配置,点OK
关键细节:Dev-C++ 调用的是 clang.exe,不是 clang++.exe —— 它靠文件扩展名(.cpp)自动决定用 C 还是 C++ 模式,所以不用单独配 clang++。
真正麻烦的从来不是“怎么切”,而是切完之后发现链接失败、头文件找不到、或 inline 函数报错 —— 那往往是因为 Clang 默认用 gnu99,GCC 用 gnu89,标准差异暴露了代码隐含问题。这时候别急着换回 GCC,先加 -std=gnu89 或检查 #include 是否漏了。










