vscode clang-clangd-lldb-cmake

Endless_daydream Lv4

环境:ubuntu22.04

clang是LLVM团队出的编译器,clangd是lsp。据说更好用,慕名而来尝试。

配置

clang

1
sudo apt install clang

安装完成后尝试直接编译会找不到标准库,-v选项能看到clang尝试寻找的是/usr/include/c++/12:

1
clang++ main.cpp -v

而现在只有/usr/include/c++/11目录,于是安装c++12库

1
sudo apt install libstdc++-12-dev

现在可以编译成功

参考

clangd

clangd原本也是apt安装的15版,在vscode上运行效果不好。现在是vscode先装clangd插件,然后重开vscode会提示没有clangd,通过提示安装的18版,不会自动链接到/usr/bin下。

用户配置在~/.config/clangd/config.yaml

项目配置在project/.clangd

vscode

在网上找了一份配置,注释是原模原样的。放到setting.json文件中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
"clangd.arguments": [
// 让 Clangd 生成更详细的日志
"--log=verbose",
// 输出的 JSON 文件更美观
"--pretty",
// 全局补全(输入时弹出的建议将会提供 CMakeLists.txt 里配置的所有文件中可能的符号,会自动补充头文件)
"--all-scopes-completion",
// "--query-driver=/usr/bin/gcc*",
// "--query-driver=/usr/bin/g++*",
"--query-driver=/usr/bin/clang++*",
// 建议风格:打包(重载函数只会给出一个建议)
// 相反可以设置为detailed
"--completion-style=bundled",
// 跨文件重命名变量
"--cross-file-rename",
// 允许补充头文件
"--header-insertion=iwyu",
// 输入建议中,已包含头文件的项与还未包含头文件的项会以圆点加以区分
"--header-insertion-decorators",
// 在后台自动分析文件(基于 complie_commands,我们用CMake生成)
"--background-index",
// 启用 Clang-Tidy 以提供「静态检查」
"--clang-tidy",
// Clang-Tidy 静态检查的参数,指出按照哪些规则进行静态检查,详情见「与按照官方文档配置好的 VSCode 相比拥有的优势」
// 参数后部分的*表示通配符
// 在参数前加入-,如-modernize-use-trailing-return-type,将会禁用某一规则
"--clang-tidy-checks=cppcoreguidelines-*,performance-*,bugprone-*,portability-*,modernize-*,google-*",
// 默认格式化风格: 谷歌开源项目代码指南
// "--fallback-style=file",
// 同时开启的任务数量
"-j=2",
// pch优化的位置(memory 或 disk,选择memory会增加内存开销,但会提升性能) 推荐在板子上使用disk
"--pch-storage=disk",
// 启用这项时,补全函数时,将会给参数提供占位符,键入后按 Tab 可以切换到下一占位符,乃至函数末
// 我选择禁用
"--function-arg-placeholders=false",
// compelie_commands.json 文件的目录位置(相对于工作区,由于 CMake 生成的该文件默认在 build 文件夹中,故设置为 build)
"--compile-commands-dir=build"
],

比较重要的是这一条,这样编译器默认找的标准库clangd也能找到

1
"--query-driver=/usr/bin/clang++*",

现在是配在vscode的setting.json,理论上也可以把配置写到用户clangd配置。

1
2
3
4
5
---
CompileFlags:
Add:
- "-isystem"
- "/usr/include/c++/12"

这部分仍有问题请看官方文档

cmake

1
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

加上这条,运行cmake会生成compile_commands.json,可以打开看看里面就是编译指令。clangd也会根据这个来找inlcude目录,这样项目内的头文件就能被找到

lldb

1
sudo apt install lldb

vscode安装插件CodeLLDB

根据cmake-tools官方仓库的说明,只有cpptools内置的debugger可以快速启动(ctrl+f5),也就是使用下方的小虫子按钮,其他调试器都要通过配置launch.json,按f5来启动

参考官方仓库的markdown ,lldb的launch.json配置如下:

lldb-mi被移出lldb项目了,需要自己从github拉下来编译。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
"version": "0.2.0",
"configurations": [
{
"name": "(lldb) Launch",
"type": "cppdbg",
"request": "launch",
// Resolved by CMake Tools:
"program": "${command:cmake.launchTargetPath}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"miDebuggerPath": "/usr/bin/lldb-mi",
"environment": [
{
// add the directory where our target was built to the PATHs
// it gets resolved by CMake Tools:
"name": "PATH",
"value": "${env:PATH}:${command:cmake.getLaunchTargetDirectory}"
},
{
"name": "OTHER_VALUE",
"value": "Something something"
}
],
"externalConsole": true,
"MIMode": "lldb"
}
]
}

参考这篇博客

其他问题

第一次重启vscode clangd没找到第三方库Eigen和fmt,但理论上compile_commands.json中有它们的路径,现在没有复现这个问题。

参考:

1

2

  • Title: vscode clang-clangd-lldb-cmake
  • Author: Endless_daydream
  • Created at : 2024-05-04 14:28:13
  • Updated at : 2024-05-04 21:08:52
  • Link: https://endless_daydream.gitee.io/2024/05/04/vsc-clang-clangd/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
vscode clang-clangd-lldb-cmake