基于clang打造高效的开发环境

Entropy Tree Lv4

在使用vscode进行C/C++开发过程中,一般就是直接使用gcc编译器(在windows中,它通常被称为MinGW-w64,一个gcc的移植版)、gdb调试器配合C/C++的插件来进行开发,也就是传统的gnu工具链中的组件。

但是vscodeC/C++的插件功能虽然齐全,响应速度却不够理想,于是本文介绍了使用LLVM工具链组件中的clang编译器来进行C/C++开发。

本文是在Archlinux的基础上搭建以clang作为编译器、lldb作为调试器的开发环境,windows可以通过额外配置WSL来搭建开发环境。

基础环境搭建

LLVM工具链包括clang编译器、lldb调试器、lld链接器等。

1.安装vscode

这里使用的是visual-studio-code-bin EULA / aur

1
yay -S visual-studio-code-bin

2.安装基础包

通过以下命令安装即可

1
sudo pacman -S llvm clang lldb lld

3.安装vscode相关插件

打开vscode插件市场,搜索clangdCodeLLDB下载安装(如果因为网络问题下载失败,请尝试手动下载安装.vsix文件)。

运行、调试配置

1.创建配置文件

打开侧边框上的运行调试选项,点击create a launch.json file并选择LLDB,创建好.vscode文件夹下的launch.json配置文件

launch.json的初始内容如下,相关参数变量配置说明可访问官方文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug",
"program": "${workspaceFolder}/<executable file>",
"args": [],
"cwd": "${workspaceFolder}"
}
]
}

这里笔者将所有编译好的二进制文件输出到提前手动创建好的build文件夹(与源文件是同级目录),另外launch.json还需要配置tasks.json才能实现运行调试,tasks.json则是具体定义了编译的命令以及参数等。tasks.json可以手动在.vscode文件夹下创建。

最终配置如下

launch.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug",
// 编译文件的输出目录
"program": "${fileDirname}/build/${fileBasenameNoExtension}.out",
"args": [],
"cwd": "${workspaceFolder}",
"preLaunchTask": "Debug C++",
"internalConsoleOptions": "neverOpen",
// 使用内置终端
"console": "integratedTerminal"
}
]
}

tasks.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
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "Debug C++",
"command": "clang++",
"args": [
"--std=c++20",
"-Wall",
"-g", // 生成调试信息
"${file}",
"-o",
"${fileDirname}/build/${fileBasenameNoExtension}.out",
],
"options": {
"cwd": "/usr/bin"
},
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
},
]
}

使用快捷键Ctrl+F5运行代码,使用快捷键F5调试代码(需要先断点)。

到这里基本的运行、调试已经配置完成,但是这种方式需要提前在当前目录下手动创建好输出目录,否则无法成功执行任务。当然也可以直接选择将当前目录作为输出目录,但那样输出文件与源文件混杂在一起不方便处理。

基于这点,笔者这里提供了一种思路:使用Code Runner插件指定其编译命令,提供自动创建输出目录的功能(唯一的不便就是需要先执行Code Runner创建好目录之后,才能进行调试)。

因此下面介绍通过配置Code Runner插件,更改其默认的g++命令为clang++,并实现自动创建输出目录的功能。

2.Code Runner配置

首先下载安装好Code Runner的插件,在插件市场搜索Code Runner并安装

打开Code Runner的扩展配置,在搜索框中搜索code-runner.executorMap,点击Edit in settings.json打开settings.json配置文件。

settings.json文件中修改对应的配置项中的g++clang++,配置如下

1
2
3
4
"code-runner.executorMap": {
"c": "cd $dir && clang $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"cpp": "cd $dir && clang++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
}

指定输出目录,例如输出到当前目录的build目录下(自动创建),则修改为以下配置

1
2
3
4
"code-runner.executorMap": {
"c": "cd $dir && mkdir -p build && clang $fileName -o build/$fileNameWithoutExt && build/$fileNameWithoutExt",
"cpp": "cd $dir && mkdir -p build && clang++ $fileName -o build/$fileNameWithoutExt && build/$fileNameWithoutExt",
}

更多参数配置说明可以参考官方仓库

至此一个简单高效的、基于LLVM工具链中的clang编译器、lldb调试器的开发环境已经搭建完成。

补充:网上很多相关教程主要是通过CMake配合clang来构建项目,CMake的配置对于单文件编译运行调试来说相对繁琐,不太适合简单的小项目。在早期笔者参考相关教程配置时意识到了这个问题,另外鉴于C/C++插件在响应速度上实在不尽人意,于是有了这篇简易的文章。

参考资料

Debugging | visual studio

variables-reference | visual studio

Code Runner | github

  • 标题: 基于clang打造高效的开发环境
  • 作者: Entropy Tree
  • 创建于 : 2023-04-01 11:55:59
  • 更新于 : 2023-04-01 21:15:42
  • 链接: https://www.entropy-tree.top/2023/04/01/clang-env-build/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论