常è§é®é¢¶
回答你的三个疑问¶
说明这的机器有两个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 也能用,重新配置时加上:
cmake -DLLVM_TARGETS_TO_BUILD="X86;RISC-V" \
-DLLVM_DEFAULT_TARGET_TRIPLE=x86_64-unknown-linux-gnu \
...
问题 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 里会是:
.clangd 配置中添加(如果用非 clang 编译器): 或在 settings.json 的 clangd.arguments 中加: 唯一注意点:gcc 和 clang 对极少数语法/扩展的处理有细微差异,但 99% 的 C++ 代码完全兼容。
¶
| 没有 clangd 怎么办 | apt install clangd 或用 cpptools 扩展,或下载预编译包 |
你当前用 LLVM 15 的 clangd 已经是最佳方案,无需改动。