clangd 的简单使用

前言

cursor 中无法使用 microsoft C/C++ 插件。

没有这个插件,在 cursor 中看 C/C++ 的代码非常不便。

在同事的推荐下,使用了 clangd 插件来进行代码阅读。

clangd 挺好用的。本文记录下 clangd 的使用过程。

clangd 的基本使用

我们先不管 clangd 的是什么。我们先看看它怎么用:Getting started

clangd 的使用分为三步:

  • 安装 clangd
  • 为编辑器安装 clangd 插件
  • 告诉 clangd ,我们的项目是如何编译的。

install clangd

root@rocky-02 ~/w/3rd# clangd --version
clangd version 19.1.7 (RESF 19.1.7-1.el9)
Features: linux
Platform: x86_64-unknown-linux-gnu; target=x86_64-redhat-linux-gnu

install editor plugins

在 cursor 中,搜索和安装 clangd 扩展。(确保 Microsoft C/C++ 扩展没有安装。因为他俩功能上有冲突

project setup

我们需要告诉 clangd 我们的项目是如何编译的。

以一个简单的构建过程为例。

这是我们需要构建的源码。

#include <iostream>
int main() {
  std::cout << "Hello, World!" << std::endl;
  return 0;
}

这是我们的 cmake 文件。

CMAKE_MINIMUM_REQUIRED(VERSION 3.20)
PROJECT(demo VERSION 1.0.0 LANGUAGES CXX)
ADD_EXECUTABLE(${PROJECT_NAME} main.cpp)

构建的使用,CMAKE_EXPORT_COMPILE_COMMANDS 选项,以生成 compile_commands.json 文件。compile_commands.json 是 JSON Compilation Database 规范的实现文件,以 JSON 格式记录项目中每个源文件的完整编译命令,是代码分析工具的核心配置文件。

root@rocky-02 ~/w/s/tmp# mkdir build && cd build
root@rocky-02 ~/w/s/t/build# cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
root@rocky-02 ~/w/s/t/build# make

查看生成的 compile_commands.json 文件。

root@rocky-02 ~/w/s/t/build# cat compile_commands.json 
[
{
  "directory": "/root/work/self/tmp/build",
  "command": "/opt/rh/gcc-toolset-14/root/usr/bin/c++    -o CMakeFiles/demo.dir/main.cpp.o -c /root/work/self/tmp/main.cpp",
  "file": "/root/work/self/tmp/main.cpp",
  "output": "CMakeFiles/demo.dir/main.cpp.o"
}
]⏎     

clangd 会在您编辑的文件的父目录中查找 compile_commands.json 文件,同时也会在名为 build/ 的子目录中查找。例如,如果正在编辑 $SRC/gui/window.cpp 文件,则会依次在 $SRC/gui/$SRC/gui/build/$SRC/$SRC/build/ … 等目录中搜索。

vscode-clangd 和 clangd 之间的关系

Language Server 简述

Language Server 是一种专用的扩展机制,通过 Language Server Protocol (LSP) 在编辑器(客户端)和分析工具(服务端)之间进行通信。它实现了跨语言的智能功能,如自动补全、错误诊断、跳转定义和代码重构,使轻量级编辑器具备强大的 IDE 能力。

LSP 通信通常是两个进程之间的交互。VS Code 插件(客户端)启动并管理一个外部的语言服务器进程(服务端)。它们之间采用基于 JSON-RPC 的 LSP 协议 交互。支持自动补全 (Completion)、错误检查与诊断 (Diagnostics)、跳转到定义 (Go to Definition)。

通过 LSP,同一种语言的服务端可以被轻松移植到其他支持 LSP 的 IDE(如 Vim, Emacs)中。

vscode-clangd 和 clangd 之间的关系

clangd 是一个 language server 。vscode-clangd 和 clangd 的交互时序大体如下。

The relationship between vscode-clangd and clangd

即,vscode-clangd会启动一个 clangd的服务。启动的时候,可以指定 clangd启动参数。通常来说,我们不需要指定参数,使用默认值即可。

有时候会用到。比如我们生成的 compile_commands.json 文件,不在 clangd 的搜索路径中。。我们可以在启动 clangd的时候,指定下启动参数。

vscode clangd config

clangd more

使用 bear 记录构建过程

CMAKE_EXPORT_COMPILE_COMMANDS 只为通过 CMake 原生规则(如 add_library/add_executable)编译的单元生成条目。add_custom_command调用 clang 不会出现在 compile_commands.json 文件中。比如这个示例 FindBpfObject.cmake

但是 Bear 可以。它通过 LD_PRELOAD 预加载库,劫持系统的 exec 调用。构建过程中所有编译器(gcc/clang)调用都被捕获。 过滤、整理后,生成 compile_commands.json文件。

root@rocky-02 ~/w/s/d/4/build (laboratory)# bear -- make

配置

.clang 是一个 YAML 格式的配置文件。它可以对 compile_commands.json中记录的编译过程,进行微调。偶尔会用到。比如下面这个(注意,这个 相对路径 .是构建目录,而不是源码目录。)

CompileFlags:
  Add: [-I.]

啥意思呢。比如, compile_commands.json 中记录的是 clang xxx.c

添加这个 .clang配置后,就相当于 clang -I. xxx.c

大多数时候不需要设置。用到的时候,可以参考 Configuration

其他

CodeLLDB

使用 clangd后,我们无法再使用 Microsoft C/C++ 扩展。所以,也没法使用 C/C++ 扩展来调试代码了。

我们可以使用 CodeLLDB 进行代码调试。

有点需要注意的是。Visual Studio Code 的 CodeLLDB 扩展被拆分为两个部分:一个轻量级前端(即扩展本身)和一个平台特定的后端(即调试器适配器)。所以,我们第一次使用该插件的时候,会弹出 出”acquiring codelldb platform package”

acquiring codelldb platform package

由于网络原因,我们下载的时候,可能会卡住,或者很慢 stuck on “Acquiring CodeLLDB platform package” when installing in WSL VSCode · Issue #805 · vadimcn/codelldb

所以,这个扩展,我们也可以离线安装:VSCode: Acquiring CodeLLDB platform package 速度慢_wx62c2d17f67691的技术博客_51CTO博客

C/C++ for Cursor extension

我们可以直接安装这个扩展。安装这个扩展的时候,cursor 会自动拉取并安装 clangd、CodeLLDB、CMake Tools

本质,还是 clangd 扩展提供 IntelliSense 功能。

调试的时候,我试了下,直接使用使用 C/C++ extension 提供的调试功能,把CodeLLDB 禁用了,也可以继续调试。

C/C++ for cursor
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇