目的
想要在 VScode 上使用 clang 编译 + LLDB 调试 + clangd 自动补全这一套工具链。 理由是上述工具链是比 gcc+gdb更新的工具链,在各方面都更好,如 clang 比 gcc 报错更友好等。而且 VScode 自带补全很捞,很难用,因此想用 clangd 代替。 可惜 LLDB 在今天(2021年12月)在 Windows 平台上并没有很好的支持,再考虑到很多代码都是 Linux 上跑的,不如直接配一个 Linux 环境,因此使用 WSL(Windows Subsystem for Linux)。
WSL 环境
WSL 安装可以自行百度,还是比较简单的。 在这里使用 WSL 的 Ubuntu 系统,本来想用自己移植的 openEuler 的,但是 openEuler 很多软件比较旧,因此用 Ubuntu。 环境:WSL of Ubuntu 操作系统版本:20.04.3 LTS (Focal Fossa)
安装工具链
当前工具链版本最新为 13,但是 20.04 版本的 Ubuntu 最新为 12,默认为 10。
安装版本 10
sudo apt install clang clangd llvm liblldb-dev
安装版本 12
我用的是最新 12 版本的,使用 update-alternative 来设置设置默认命令使用 12 版本提供的
sudo apt install clang-12 clangd-12 llvm-12 liblldb-12-dev
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-12 100
sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-12 100
sudo update-alternatives --install /usr/bin/llvm-dis llvm-dis /usr/bin/llvm-dis-12 100
VScode 插件
必装:
- clangd
- CodeLLDB
选装: 3. CMake 4. CMake Tools 5. Clang-Format 6. Clang-Tidy 7. Code Runner
配置 VScode
settings.json
按下 Ctrl+Shift+P,输入 setting,找到 WSL 的选项 粘贴以下配置:
{
"code-runner.runInTerminal": true,
"code-runner.saveFileBeforeRun": true,
"code-runner.clearPreviousOutput": true,
"clangd.arguments": [
"--compile-commands-dir=${workspaceFolder}/build",
"--background-index",
"-j=12",
"--query-driver=/usr/bin/clang++",
"--clang-tidy",
"--clang-tidy-checks=performance-*,bugprone-*",
"--all-scopes-completion",
"--completion-style=detailed",
"--function-arg-placeholders",
"--header-insertion=iwyu",
"--pch-storage=memory",
],
}
生成 clangd 配置文件
clangd 对每个项目都需要生成一个名为 compile_commands.json 的配置文件,参见官方文档 一共有以下三种方式
Cmake 项目
在CMakeLists.txt文件中添加set(CMAKE_EXPORT_COMPILECOMMANDS ON) 运行
mkdir -p build
cd build && cmake ..
可以发现在 build目录下已经生成了 compile_commands.json文件
make 或其他项目
sudo apt install bear
bear make
调试
点击运行和调试按钮 -> C++(GDB/LLDB) 会生成默认模板,可以修改如下:
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "(lldb) Launch",
"type": "lldb",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}.out",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"internalConsoleOptions": "neverOpen",
"MIMode": "lldb",
"miDebuggerPath": "/usr/bin/lldb",
"setupCommands": [
{
"description": "Enable pretty-printing for lldb",
"text": "-enable-pretty-printing",
"ignoreFailures": false
}
],
"preLaunchTask": "Compile"
}
]
}
tasks.json
按下 Ctrl+Shift+P 粘贴以下作为 tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "Compile",
"type": "process",
"command": "clang++",
"args": [
"${file}",
"-g",
"-o",
"${fileDirname}/${fileBasenameNoExtension}.out",
"-Wall",
"-std=c++17",
],
"group": {
"kind": "build",
"isDefault": true
},
"options": {
"cwd": "${fileDirname}"
},
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared"
}
}
]
}
即可使用调试
|