VSCode 配置 C/C++:VSCode + Clang + Clangd + LLDB + CMake + Git


VSCode + GCC + GDB + Git进行学习,翻阅韩骏老师的《Visual Studio Code 权威指南》时,发现他在C++栏目里推荐了名为「vscode-clangd」的插件(已改名为clangd)。

        后配置相关插件时遇到诸多问题,查阅不少文章、文档,经几天才配置满意。想到可能有同道会遇到同样的问题,故而写下本文章。

        文章主旨是初学C++的人简易地配置出一个满意的编程环境,不会有CMake、Git等的详细教程。我认为这就像婴儿学步一样:婴儿练习的是跑步,经历多次跌倒后很快便学会了走路,借助学步车的反而学得很慢。

        ——我想提供的是「助跑器」,而不是「学步车」。

        由于仅从今年4月开始学习,会存在很多疏漏和不够专业的地方,还望海涵。

官方文档配置好的 VSCode 相比拥有的优势

  • 代码拥有更加丰富的颜色。我利用 VSCode Default Dark+ 主题自带的代码颜色的互补色、相近色,为「类型参数」、「成员函数」、「成员变量」、「函数参数」等与「类」、「自动变量」的颜色作了区分。
代码拥有更加丰富的颜色
代码拥有更加丰富的颜色
  • 相对更加精准的「功能」、「转到定义」、「重命名符号」等功能。
  • Clang-Tidy提供了强大的「静态检查」支持,并对于部分代码提供「快速修复」。具体请见Clang-Tidy Checks。这里我主要添加了对于「Google 开源项目风格指南(有中文版,但翻译版本滞后,需注意)」「Cpp Core Guidelines」和性能、潜在的bug、移植性、现代C++的检查。
静态检查
  • 自动添加头文件。对于建议中的项会即时自动添加头文件,导航条会自动下移(观察行号)隐藏添加的头文件。
自动添加头文件
自动添加头文件
  • 利用「Git」进行版本管理。
  • 通过「CMake」实现项目管理。

vscode-lldb 在 GitHub 的 Issues 中给出的静态链接相关库」和「Clang 编译器用户手册中给出的将 -g 改为 -glldb」等方法,最终无果。

官方网站获取

下载安装包并安装即可,略。

《VSCode官网下载缓慢或下载失败的解决办法》

这里给出 x86_64 1.60.0 版本的下载链接。

官方网站获取

下载安装包并安装即可,略。

清华大学开源软件镜像站获取

进入清华大学开源软件镜像站,点击右侧的「获取下载链接」,切换到「应用软件」即可找到。

清华大学开源软件镜像站

官方网站获取

下载安装包并安装即可,略。

清华大学开源软件镜像站获取

进入清华大学开源软件镜像站,点击右侧的「获取下载链接」,切换到「应用软件」即可找到。

 安装时,切换 Git 的默认编辑器为 VSCode。

切换 Git 的默认编辑器为 VSCode

vscode-lldb 用户手册)

  1.   /********
  2.   * LLDB *
  3.   ********/
  4.   // LLDB 指令自动补全
  5.   "lldb.commandCompletions": true,
  6.   // LLDB 指针显示解引用内容
  7.   "lldb.dereferencePointers": true,
  8.   // LLDB 鼠标悬停在变量上时预览变量值
  9.   "lldb.evaluateForHovers": true,
  10.   // LLDB 监视表达式的默认类型
  11.   "lldb.launch.expressions": "simple",
  12.   // LLDB 不显示汇编代码
  13.   "lldb.showDisassembly": "never",
  14.   // LLDB 生成更详细的日志
  15.   "lldb.verboseLogging": true,
 

 Fira Code 字体。

然后配置如下:

  1.   /********
  2.   * Font *
  3.   ********/
  4.   // 输出窗口
  5.   "[Log]": {
  6.   // 字体大小
  7.   "editor.fontSize": 15
  8.   },
  9.   // CodeLens的字体系列: Fira Code Two iScript
  10.   "editor.codeLensFontFamily": "Fira Code",
  11.   // 字体系列: Fira Code Two iScript
  12.   "editor.fontFamily": "Fira Code",
  13.   // 启用连字体
  14.   "editor.fontLigatures": true,
  15.   // 字体大小
  16.   "editor.fontSize": 16,
  17.   // 集成终端字体大小
  18.   "terminal.integrated.fontSize": 14,
 

VSCode 配置 C/C++ 终极解决方案:vs code + clang + clangd + lldb (MacOS利用完整 clang-llvm 工具链)。 

文件夹命名规范源自 Google 开源项目代码指南,戳此为中文版,但翻译版本滞后,需注意。

当然,未用粗体标出的所有文件/文件夹名都可自定义。

我们在电脑某处新建一个文件夹「code」,专用于编程;在「code」文件夹中新建一个文件夹「cpp」,用于C++编程。

在「VSCode」中选择「文件」-「将文件夹添加到工作区...」,将「cpp」文件夹添加进来,此后我们可以通过「文件」-「工作区另存为...」来保存该工作区以便后序使用以及单独配置、安装插件等。

接下来我们按照自己的需要新建文件夹,比如:

我打算新建一个「practice」文件夹用于学习书上例题、习题,在「practice」内按照再书籍名称、目录细分子文件夹。

同时新建一个「gsl」文件夹,在里面存放「Cpp Core Guidelines」使用的轻量库GSL: Guidelines support library——一个只需包含头文件,无需链接的库。

(这里是为了说明,碰巧这个库在 MSYS2 中无法下载,你也可以下载后把「gsl」文件夹放在「MSYS2 安装路径\clang64\include」里作为「系统头文件」)

接下来我们考虑一件事:如何编译链接、调试代码?

虽然接下来会用 CMake 来管理整个工作区,但我并不打算借助CMake来负责编译链接代码(这也是个一旦入门就很简单的问题),CMake 在这里的作用仅仅是支撑框架、为 Clangd 提供「compile_commands.json」以分析多文件项目。

如果你想要学习如何通过CMake来进行编译、链接,请在看完本文章后,浏览最后的-7- 参考

我们在根目录新建文件夹「.vscode」,在其内新建全名为「tasks.json」(任务)和全名为「launch.json」(调试配置)的文件。

老样子,我会附出代码和对应注释,如果你想真正理解,就需要翻阅更多资料了

tasks.json:

额外的,对于 gsl 库,在参数中加入"-I${workspaceFolder}\\gsl"(-大写的i)(include)

由于 gsl 库只有头文件,故无需再参数中加入"-lgsl"(-小写的L)(link)来链接

  1.   {
  2.   "tasks": [
  3.   {
  4.   "type": "shell",
  5.   "label": "Clang++: 编译单文件",
  6.   // 编译器路径
  7.   "command": "C:\\msys64\\clang64\\bin\\clang++.exe",
  8.   // 编译器后附的参数,反映在终端里即"clang+ arg1 arg2 arg3..."
  9.   "args": [
  10.   // 编译的文件
  11.   "${fileDirname}\\${fileBasenameNoExtension}.cc",
  12.   // 生成文件到 build 文件夹中,文件名为debug.exe
  13.   "-o",
  14.   "${workspaceFolder}\\build\\debug.exe",
  15.   // 启用调试(debug)
  16.   "-g",
  17.   // 启用所有诊断,不过可能会因为一些无伤大雅的问题而无法编译
  18.   // 比起 -Weverything 这是 Clang 编译器用户手册中推荐的方式
  19.   "-Wall",
  20.   "-Wextra",
  21.   // 多线程支持
  22.   "-pthread",
  23.   // 使用 LLVM lld 链接器而不是默认链接器
  24.   "-fuse-ld=lld",
  25.   // 启用 debug 信息优化
  26.   "-fstandalone-debug",
  27.   // 诊断信息着色
  28.   "-fcolor-diagnostics",
  29.   // 分析所有注释(这其实只需告诉 Clangd ,即添加到 compile_commands.json 中)
  30.   // Clang 默认只分析 Doxygen 风格("/**", "///"开头)的注释
  31.   "-fparse-all-comments",
  32.   // 设置 C++ 的标准库为 libc++: Clang 对应的标准库
  33.   "-stdlib=libc++",
  34.   // 设置 C++ 版本为 c++20
  35.   "-std=c++20",
  36.   // 为给定环境生成代码
  37.   "--target=x86_64-w64-mingw",
  38.   ],
  39.   "options": {
  40.   // Clang 的启动路径
  41.   "cwd": "${workspaceFolder}"
  42.   },
  43.   "problemMatcher": ["$gcc"],
  44.   "group": {
  45.   "kind": "build",
  46.   "isDefault": true
  47.   },
  48.   "presentation": {
  49.   "echo": true,
  50.   // 执行任务时是否跳转到终端面板,可以为always,silent,never。具体参见VSC的文档,即使设为never,手动点进去还是可以看到
  51.   "reveal": "always",
  52.   // 设为true后可以使执行task时焦点聚集在终端,但对编译C/C++来说,设为true没有意义
  53.   "focus": false,
  54.   // 不同的文件的编译信息共享一个终端面板
  55.   "panel": "shared"
  56.   },
  57.   "detail": "Clang++: 编译单个文件"
  58.   },
  59.   {
  60.   "type": "shell",
  61.   "label": "Clang++: 编译多文件",
  62.   "command": "C:\\msys64\\clang64\\bin\\clang++.exe",
  63.   "args": [
  64.   // '*'是通配符
  65.   "${fileDirname}\\*.cc",
  66.   "-o",
  67.   "${workspaceFolder}\\build\\debug.exe",
  68.   "-g",
  69.   "-Wall",
  70.   "-Wextra",
  71.   "-pthread",
  72.   "-fuse-ld=lld",
  73.   "-fstandalone-debug",
  74.   "-fcolor-diagnostics",
  75.   "-fparse-all-comments",
  76.   "-stdlib=libc++",
  77.   "-std=c++20",
  78.   "--target=x86_64-w64-mingw",
  79.   ],
  80.   "options": {
  81.   "cwd": "${workspaceFolder}"
  82.   },
  83.   "problemMatcher": ["$gcc"],
  84.   "group": {
  85.   "kind": "build",
  86.   "isDefault": true
  87.   },
  88.   "presentation": {
  89.   "echo": true,
  90.   "reveal": "always",
  91.   "focus": false,
  92.   "panel": "shared"
  93.   },
  94.   "detail": "Clang++: 编译当前文件所在目录里所有文件"
  95.   }
  96.   ],
  97.   "version": "2.0.0"
  98.   }
 

launch.json:

  1.   {
  2.   // 使用 IntelliSense 了解相关属性。
  3.   // 悬停以查看现有属性的描述。
  4.   // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
  5.   "version": "0.2.0",
  6.   "configurations": [
  7.   {
  8.   "name": "LLDB: 生成和调试单文件",
  9.   "type": "lldb",
  10.   "request": "launch",
  11.   "program": "${workspaceFolder}\\build\\debug",
  12.   "args": [],
  13.   "stopOnEntry": false,
  14.   "cwd": "${fileDirname}",
  15.   "internalConsoleOptions": "neverOpen",
  16.   "environment": [],
  17.   "externalConsole": false,
  18.   "preLaunchTask": "Clang++: 编译单文件"
  19.   },
  20.   {
  21.   "name": "LLDB: 生成和调试多文件",
  22.   "type": "lldb",
  23.   "request": "launch",
  24.   "program": "${workspaceFolder}\\build\\debug",
  25.   "args": [],
  26.   "stopOnEntry": false,
  27.   "cwd": "${fileDirname}",
  28.   "internalConsoleOptions": "neverOpen",
  29.   "environment": [],
  30.   "externalConsole": false,
  31.   "preLaunchTask": "Clang++: 编译多文件"
  32.   },
  33.   {
  34.   "name": "LLDB: 调试已编译的 debug.exe",
  35.   "type": "lldb",
  36.   "request": "launch",
  37.   "program": "${workspaceFolder}\\build\\debug",
  38.   "args": [],
  39.   "stopOnEntry": false,
  40.   "cwd": "${fileDirname}",
  41.   "internalConsoleOptions": "neverOpen",
  42.   "environment": [],
  43.   "externalConsole": false,
  44.   }
  45.   ]
  46.   }
 

配置好后,你可以点击「终端」-「运行生成任务...」或Ctrl + Shift + B运行任务,这会同注释一样,编译你打开的文件,并输出为工作区根目录下的 debug.exe。

之后(或你可以同时进行),你可以点击「运行」-「启动调试」或 F5 进行调试,要更换调试配置,点击左侧「运行和调试」即可在侧边栏上方更改了。

更多的参数请参考 Visual Studio Code Variables Reference 和 Clang 编译器用户手册。

.gitignore

VSCode 快捷键 或 「文件」-「首选项」-「键盘快捷方式」):

Get Started with C++ and Mingw-w64 in Visual Studio Code
  • Clang 编译器用户手册
  • Clang-Format 风格配置
  • Clang-Format 文档
  • vscode-lldb 用户手册
  • 在windows上通过msys2/mingw来安装gcc / clang_茶佬牛逼
  • 配置VSCode的C/C++语言功能 - literalkernel
  • 最终,我看向了clangd
  • CMake 简介和 CMake 模板 - 米罗西
  • CMake在多级目录项目中的简单使用
  • VSCode 配置 C/C++ 终极解决方案:vs code + clang + clangd + lldb (MacOS利用完整 clang-llvm 工具链)
  • CMake简明教程 实例工程演示(含字幕)

    • https://blog.csdn.net/tyKuGengty/article/details/120119820?spm=1035.2023.3001.6557&utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-2~default~OPENSEARCH~default-2.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-2~default~OPENSEARCH~default-2.nonecase

    相关