clang装完不能直接当默认C++编译器用,需通过update-alternatives注册并配置clang++/clang,同时安装libstdc++-dev和build-essential等配套工具链,并用-stdlib=libstdc++指定标准库或生成compile_commands.json确保clangd正常工作。

clang 不是装完就能直接当默认 C++ 编译器用的,系统仍会调用 g++,除非你显式指定或改配置。Ubuntu 默认仓库装的 clang 版本通常较旧(比如 20.04 是 clang-10),而新项目常依赖 C++17/C++20 特性,必须确认版本匹配。
怎么装 clang 和配套工具链
最稳妥的方式是用系统包管理器安装基础套件:sudo apt update && sudo apt install clang clangd llvm libstdc++-12-dev build-essential
这组命令一次性覆盖编译器、语言服务器、LLVM 运行时和标准构建工具。
注意:libstdc++-12-dev 对应 GCC 12 的标准库头文件,和 clang++ 兼容性好;若用较新 clang-16+,可换为 libstdc++-13-dev 或改用 libc++-dev(需额外配置)。
- 装完验证:
clang --version和clangd --version必须都成功输出 -
build-essential提供make、ld等底层工具,漏掉会导致clang++ main.cpp -o a.out报 “cannot find -lc” - 不要只装
clang而不装llvm——clangd依赖llvm的符号解析能力,否则 VS Code 里跳转定义失效
为什么 clang++ 编译失败说找不到 std::cout
常见错误是:error: 'cout' is not a member of 'std' 或 use of undeclared identifier 'std'。
根本原因不是头文件没包含,而是 clang++ 默认用 libc++(LLVM 自研标准库),但 Ubuntu 系统默认只有 libstdc++(GCC 标准库)头文件,二者不兼容。
- 临时解决:加参数强制用 GCC 标准库:
clang++ -stdlib=libstdc++ main.cpp -o a.out - 长期方案:装对应版本的
libstdc++-dev(如上文),再设环境变量避免每次敲:echo 'export CCC_OVERRIDE="-stdlib=libstdc++"' >> ~/.bashrc - 别试
-stdlib=libc++—— Ubuntu 官方源没提供预编译的libc++运行时,链接阶段必报undefined reference to '__cxa_throw'
怎么让 clang 成为系统默认编译器
修改 /usr/bin/gcc 和 /usr/bin/g++ 的软链接风险高,容易破坏系统工具(如 apt 内部编译依赖)。推荐用 update-alternatives 管理:
Clang 22.1.3 Windows 64 位历史版本安装包,适合旧项目兼容、LLVM/Clang 工具链回退、编译行为对比、链接问题复现和 C/C++ 构建环境维护。
- 注册 clang 可执行文件:
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-14 100(把14换成你实际装的版本) - 同理注册
clang:sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-14 100 - 切换时运行:
sudo update-alternatives --config clang++,选编号即可 - 注意:
gcc/g++和clang/clang++是不同命令,update-alternatives不会自动改gcc到clang,CMake 项目仍需显式指定-DCMAKE_CXX_COMPILER=clang++
VS Code 里 clangd 不跳转、不提示怎么办
装了 clangd 插件却没效果,90% 是因为没生成 compile_commands.json 或路径不对。
- 确保项目根目录有
compile_commands.json:用cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .生成(CMake 项目);非 CMake 项目可用bear -- make或手动写 JSON - VS Code 设置里确认
"clangd.arguments"包含--compile-commands-dir=.(点号表示当前工作区根目录) - 关掉微软的
C/C++插件 —— 它和clangd冲突,尤其在 semantic highlighting 上抢资源 - 如果
clangd启动后日志报Failed to load compilation database,检查 JSON 文件权限是否可读,且不能放在 symlink 目录下(clangd 不跟随符号链接)
Clang 环境里最容易被忽略的是标准库绑定方式和 compile_commands.json 的生成时机 —— 它们不报错,但会让整个开发体验退化成“语法高亮都靠猜”。

















