跳转至

常见问题

回答你的三个疑问

说明这的机器有两个llvm, llvm21只编译了RISCV, llvm15编译了x86,我本地机器是x86。

问题 1:为什么 LLVM 21 不能用?必须编译本机架构吗?

是的,必须编译本机架构。 我验证了你的两个 LLVM 构建配置:

LLVM 21 LLVM 15
LLVM_TARGETS_TO_BUILD RISCV(只有 RISC-V) X86(本机架构)
LLVM_DEFAULT_TARGET_TRIPLE 空字符串 ← 问题根源 x86_64-unknown-linux-gnu

根本原因:你构建 LLVM 21 时设置了 -DLLVM_TARGETS_TO_BUILD=RISCV,但没有设置 LLVM_DEFAULT_TARGET_TRIPLE。这导致: - LLVM 21 不知道默认目标平台是什么(triple 为空) - clangd 启动时,无法推断出 target triple,于是变成 'unknown' - Clang 前端构建 AST 时依赖 target triple 来确定:基本类型大小(sizeof(int))、数据模型(LP64)、ABI 对齐、预定义宏(__x86_64__)、内置函数等 - triple 为 unknown → Clang 无法创建 TargetInfo → AST 构建失败 → 所有跳转/补全失效

为什么需要本机架构? 因为你在 x86_64 机器上编辑代码,系统头文件、项目代码都假设目标是 x86_64。即使只做语法分析(不生成代码),Clang 前端也需要正确的 target 来正确解析这些内容。

如果想让 LLVM 21 也能用,重新配置时加上:

Bash
cmake -DLLVM_TARGETS_TO_BUILD="X86;RISC-V" \
      -DLLVM_DEFAULT_TARGET_TRIPLE=x86_64-unknown-linux-gnu \
      ...
但当前用 LLVM 15 已经足够,无需重新编译。


问题 2:用 gcc 编译的项目,能用 clangd 15 吗?

可以,完全没问题。 clangd 不关心项目实际用哪个编译器构建。

工作原理: 1. clangd 只读取 compile_commands.json 中的编译参数(-I-D-std= 等 flags) 2. 它内部用 Clang 的前端做语法分析,与实际构建用的编译器(gcc/g++/clang/clang++)无关 3. 当 compile_commands.json 中是 g++ 命令时,clangd 会用 --query-driver 选项去执行 g++,提取它的系统 include 路径

你的项目当前用的是 clang++,但如果换成 gcc 构建,compile_commands.json 里会是:

JSON
"command": "/usr/bin/g++ -I... -std=c++17 -c file.cpp"
clangd 照样能正常工作,只需在 .clangd 配置中添加(如果用非 clang 编译器):
YAML
CompileFlags:
  Compiler: g++
或在 settings.json 的 clangd.arguments 中加:
Text Only
--query-driver=/usr/bin/g++,/usr/bin/g++-*

唯一注意点:gcc 和 clang 对极少数语法/扩展的处理有细微差异,但 99% 的 C++ 代码完全兼容。


没有 clangd 怎么办 apt install clangd 或用 cpptools 扩展,或下载预编译包

你当前用 LLVM 15 的 clangd 已经是最佳方案,无需改动。