欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

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

最编程 2024-07-18 19:09:39
...

-1- 前言

①目的

        我于今年4月开学习CS,前几月一直使用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」实现项目管理。

 

③未解决的问题

  • 用 LLDB 调试时,无法正确跳转到「系统头文件」而显示为「未知源」,使用 GDB 调试同一个文件则没有此问题。尝试过「vscode-lldb 在 GitHub 的 Issues 中给出的静态链接相关库」和「Clang 编译器用户手册中给出的将 -g 改为 -glldb」等方法,最终无果。

-1- 安装

①安装 VSCode

通过官方网站获取

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

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

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

 

②安装 MSYS2

通过官方网站获取

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

下载慢?通过清华大学开源软件镜像站获取

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

清华大学开源软件镜像站

 

③安装 Git

通过官方网站获取

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

下载慢?通过清华大学开源软件镜像站获取

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

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

切换 Git 的默认编辑器为 VSCode

 

④配置环境变量

右键「开始」菜单,选择「系统」,在「系统」中点击「高级系统设置」,选择「环境变量(N)...」,在上方的「用户变量」或下方的「系统变量」,找到「Path」并选中编辑。

如果得到的是图一样式,在原「变量值」尾部加入英语输入法下的分号「;」后,加入「MSYS2 安装路径\clang64\bin」(默认为 C:\msys64\clang64\bin)。

图一

如果得到的是图二样式,点击「新建」,并输入「MSYS2 安装路径\clang64\bin」(默认为 C:\msys64\clang64\bin)即可。

图二

同样的我们也可以把C:\msys64\mingw64\bin加入其中,但我并没有用上。

 

⑤利用 MSYS2 安装「Clang」「CMake」「Git」等软件

通过「开始」菜单,或路径(默认为 C:\msys64 )打开「MSYS2.exe」

以下是会用到的指令:

  1.  
    pacman -Syu // 更新整个系统
  2.  
    pacman -Su // 更新已安装的包
  3.  
    pacman -Ss 关键字 // 搜索含关键字的包
  4.  
    pacman -S 包名 // 安装包,也可以同时安装多个包,只需以空格分隔包名即可
  5.  
    pacman -Rs 包名 // 删除包及其依赖
  6.  
    pacman -R 包名 // 删除包

比如《C++程序设计:原理与实践》一书中提到 FLTK 库。输入「pacman -Ss fltk」进行搜索,会查找到众多包名。由于使用的是clang64,所以需要安装以clang64/开头的「mingw-w64-clang-x86_64-fltk」。可以通过右键进行复制,接着输入「pacman -S mingw-w64-clang-x86_64-fltk」即可安装。

pacman -Ss fltk

这里我直接列出需要执行的指令:

  1.  
    pacman -S mingw-w64-clang-x86_64-toolchain
  2.  
    pacman -S mingw-w64-clang-x86_64-cninja
  3.  
    pacman -S mingw-w64-clang-x86_64-python-six
  4.  
    pacman -S mingw-w64-clang-x86_64-python-pip
  5.  
    pacman -S mingw-w64-clang-x86_64-benchmark
  6.  
    pip install cmake_format
  7.  
    pacman -Syu
  8.  
    pacman -Syu

题外话:笔者最近使用 cpan 安装 Perl 模块时发现,需要使用的是 Clang64.exe,来安装对应 perl 的模块,而非 msys2.exe.

⑥在 VSCode 中安装需要的插件

打开「VSCode」点击左边栏上方最后一项「Extensions」以进行插件安装,必需的插件请见快速安装我所推荐插件。

当然,我们也可以搜索「Chinese」安装汉化界面插件,后面的表述也会用汉化后的界面,更多插件请见「-4-(可选)我所使用的VSCode插件」。

快速安装我所推荐插件 

用「VSCode」打开一个文件夹,在该文件夹中新建名为「.vscode」的文件夹,在其中新建全名为「extensions.json」的文件,并在其中加入如下代码。

  1.  
    {
  2.  
    "recommendations": [
  3.  
    "llvm-vs-code-extensions.vscode-clangd",
  4.  
    "vadimcn.vscode-lldb",
  5.  
    "ms-vscode.cpptools",
  6.  
    "twxs.cmake",
  7.  
    "ms-vscode.cmake-tools",
  8.  
    "cheshirekow.cmake-format"
  9.  
    ]
  10.  
    }

如图所示

extensions.json

同样的,由左边栏进入「Extensions」,在搜索框中输入「@recommended」,即可得到我所推荐的插件。(然而还是只能一个一个点击安装)

注意:

  • 先安装「C/C++」再安装「clangd」安装完成后,会提示发生冲突(见下图),请选择「Disable IntelliSense」。
  • MSYS2 中安装的 clangd 存在一定问题,请在 VSCode 中通过「Ctrl + Shift + P」打开命令菜单,输入 clangd 并 选择「clangd: Download language server」安装插件提供的版本。
输入「@recommended」
冲突

-2- 配置配置文件

「VSCode」界面下,点击左下角的齿轮,选择「设置」,我们可以通过切换「用户」/「工作区」等,决定是为整个软件还是为单个工作区更改设置。

在右上角点击「打开设置」,可以切换到设置对应的 「settings.json」 文件。

这里我倾向于将尽量多的设置置于 VSCode 的配置文件中,以便于用账号同步设置,没有给 Clangd 等单独新建配置文件。

设置界面

如果阅读了安装插件并按照注意进行了操作,那么在 settings.json 中已经存在以下配置(路径可能不同):

  1.  
    {
  2.  
    "clangd.path": "c:\\Users\\FeignClaims\\AppData\\Roaming\\Code\\User\\globalStorage\\llvm-vs-code-extensions.vscode-clangd\\install\\12.0.1\\clangd_12.0.1\\bin\\clangd.exe",
  3.  
    "C_Cpp.intelliSenseEngine": "Disabled"
  4.  
    }

我们可以看到,配置行之间以英语输入法下的逗号「,」间隔,整个配置文件之外还会有一对大花括号,我们可以将鼠标停在"clangd.path"上,以查看配置说明

针对"clangd.path"一项,你也可以使用 「MSYS2 安装路径\\clang64\\bin\\clangd.exe」。

接下来我将贴出我的各插件及 VSCode 的部分配置及注释(注意添加逗号),你可以选择性地后附到自己的 settings.json 中。

我所使用的通用插件和 C/C++ 插件及其配置请见 -4-(可选)我所使用的VSCode插件-5-(可选)我所使用的VSCode配置。

 

VSCode

  1.  
    /**********
  2.  
    * VSCode *
  3.  
    **********/
  4.  
    // 控制是否应在调试控制台中输入时接受建议; enter 还用于评估调试控制台中键入的任何内容
  5.  
    "debug.console.acceptSuggestionOnEnter": "on",
  6.  
    // 控制何时打开内部调试控制台
  7.  
    "debug.internalConsoleOptions": "neverOpen",
  8.  
    // 不允许 Enter 键处理输入时建议,避免换行与接受建议间的歧义
  9.  
    // 你也可以允许该项,使用 Ctrl + Enter 进行换行
  10.  
    "editor.acceptSuggestionOnEnter": "off",
  11.  
    // 控制编辑器应当自动改写左引号或右引号
  12.  
    "editor.autoClosingOvertype": "always",
  13.  
    // 禁用自动检测文件缩进模式和缩进大小,即打开文件后自动将文件更改为 VSCode 配置的缩进格式
  14.  
    "editor.detectIndentation": false,
  15.  
    // 粘贴时格式化文件
  16.  
    "editor.formatOnPaste": true,
  17.  
    // 保存时格式化文件
  18.  
    "editor.formatOnSave": true,
  19.  
    // 在编辑器中自动显示内联建议
  20.  
    "editor.inlineSuggest.enabled": true,
  21.  
    // 是否在输入时显示含有参数文档和类型信息的小面板
  22.  
    "editor.parameterHints.enabled": true,
  23.  
    // 控制是否在键入代码时自动显示建议
  24.  
    "editor.quickSuggestions": {
  25.  
    // 键入注释时不允许
  26.  
    "comments": false,
  27.  
    // 键入其他时允许
  28.  
    "other": true,
  29.  
    // 键入字符串时不允许
  30.  
    "strings": false
  31.  
    },
  32.  
    // 控制显示快速建议前的等待时间(毫秒)
  33.  
    "editor.quickSuggestionsDelay": 0,
  34.  
    // 控制编辑器在空白字符上显示符号的方式
  35.  
    "editor.renderWhitespace": "none",
  36.  
    // 代码片段建议置于其他建议之上
  37.  
    "editor.snippetSuggestions": "top",
  38.  
    // 使用空格缩进时模拟制表符的行为,可以方便对齐
  39.  
    "editor.stickyTabStops": true,
  40.  
    // 建议的接受方式
  41.  
    "editor.suggest.insertMode": "replace",
  42.  
    // 控制排序时是否提高靠近光标的词语的优先级
  43.  
    "editor.suggest.localityBonus": true,
  44.  
    "editor.suggest.shareSuggestSelections": true,
  45.  
    // 控制建议小部件底部的状态栏可见
  46.  
    "editor.suggest.showStatusBar": true,
  47.  
    // 控制在键入触发字符后是否自动显示建议
  48.  
    "editor.suggestOnTriggerCharacters": true,
  49.  
    // 始终预先选择第一个建议
  50.  
    "editor.suggestSelection": "first",
  51.  
    // 一个制表符 = 2个空格
  52.  
    "editor.tabSize": 2,
  53.  
    // 控制是否根据文档中的文字提供建议列表
  54.  
    "editor.wordBasedSuggestions": true,
  55.  
    // 把文件删除时无需确认
  56.  
    "explorer.confirmDelete": false,
  57.  
    // 移动文件时无需确认
  58.  
    "explorer.confirmDragAndDrop": false,
  59.  
    // 粘贴同名文件时的重命名方式
  60.  
    // smart: 在重复名称末尾智能地添加/递增数字
  61.  
    "explorer.incrementalNaming": "smart",
  62.  
    // 忽略扩展建议的通知
  63.  
    "extensions.ignoreRecommendations": true,
  64.  
    // 自动保存
  65.  
    "files.autoSave": "afterDelay",
  66.  
    // 自动保存的等待时间(毫秒)
  67.  
    "files.autoSaveDelay": 1000,
  68.  
    // 配置排除的文件和文件夹的glob模式
  69.  
    // 文件资源管理器将根据此设置决定要显示或隐藏的文件和文件夹
  70.  
    "files.exclude": {
  71.  
    "**/.classpath": true,
  72.  
    "**/.factorypath": true,
  73.  
    "**/.project": true,
  74.  
    "**/.settings": true
  75.  
    },
  76.  
    // 在会话间记住未保存的文件,以允许在退出编辑器时跳过保存提示
  77.  
    // onExitAndWindowClose: 退出或窗口关闭时
  78.  
    "files.hotExit": "onExitAndWindowClose",
  79.  
    // Grunt 任务自动检测
  80.  
    "grunt.autoDetect": "on",
  81.  
    // Gulp 任务自动检测
  82.  
    "gulp.autoDetect": "on",
  83.  
    // 应该在何处显示单元格工具栏,或是否隐藏它
  84.  
    "notebook.cellToolbarLocation": {
  85.  
    // 默认: 右边
  86.  
    "default": "right",
  87.  
    // jupyter-notebook: 左边
  88.  
    "jupyter-notebook": "left"
  89.  
    },
  90.  
    // 控制单元格编辑器中行号的显示
  91.  
    "notebook.lineNumbers": "on",
  92.  
    // 配置在搜索中排除的文件和文件夹的glob模式
  93.  
    "search.exclude": {
  94.  
    // "someFolder/": true,
  95.  
    // "somefile": true
  96.  
    },
  97.  
    // 显示搜索结果所在行号
  98.  
    "search.showLineNumbers": true,
  99.  
    // 当搜索词为小写时,则不区分大小写进行搜索
  100.  
    // 否则区分大小写
  101.  
    "search.smartCase": true,
  102.  
    // 集成终端默认为 PowerShell
  103.  
    "terminal.integrated.defaultProfile.windows": "PowerShell",
  104.  
    // 集成终端启用视觉化铃声
  105.  
    "terminal.integrated.enableBell": true,
  106.  
    // 集成终端编码: zh_CN.UTF-8
  107.  
    "terminal.integrated.env.windows": {
  108.  
    "LC_ALL": "zh_CN.UTF-8"
  109.  
    },
  110.  
    // 集成终端使用GPU加速
  111.  
    "terminal.integrated.gpuAcceleration": "on",
  112.  
    // 集成终端右击时选择光标下方的字词,并打开上下文菜单
  113.  
    "terminal.integrated.rightClickBehavior": "selectWord",
  114.  
    "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
  115.  
    // 窗口缩放级别: 1(原始级别为 0)
  116.  
    "window.zoomLevel": 1,
  117.  
    // 文件图标主题: 插件 vscode-icons
  118.  
    "workbench.iconTheme": "vscode-icons",
  119.  
    // 在没有从上一个会话恢复出信息的情况下,在启动时不打开编辑器
  120.  
    "workbench.startupEditor": "none",
  121.  
    // 显示视图头部的操作项
  122.  
    "workbench.view.alwaysShowHeaderActions": true,

 

Clangd

  1.  
    /**********
  2.  
    * Clangd *
  3.  
    **********/
  4.  
    // 关闭 C/C++ 提供的 IntelliSenseEngine
  5.  
    "C_Cpp.intelliSenseEngine": "Disabled",
  6.  
    // Clangd 运行参数(在终端/命令行输入 clangd --help-list-hidden 可查看更多)
  7.  
    "clangd.onConfigChanged": "restart",
  8.  
    "clangd.arguments": [
  9.  
    // 全局补全(输入时弹出的建议将会提供 CMakeLists.txt 里配置的所有文件中可能的符号,会自动补充头文件)
  10.  
    "--all-scopes-completion",
  11.  
    // 启用 Clang-Tidy 以提供「静态检查」
  12.  
    "--clang-tidy",
  13.  
    // compelie_commands.json 文件的目录位置(相对于工作区,由于 CMake 生成的该文件默认在 build 文件夹中,故设置为 build)
  14.  
    "--compile-commands-dir=build",
  15.  
    // 建议风格:打包(重载函数只会给出一个建议);反可以设置为detailed
  16.  
    "--completion-style=bundled",
  17.  
    /**
  18.  
    * Read user and project configuration from YAML files.
  19.  
    * Project config is from a .clangd file in the project directory.
  20.  
    * User config is from clangd/config.yaml in the following directories:
  21.  
    * Windows: %USERPROFILE%\AppData\Local
  22.  
    * Mac OS: ~/Library/Preferences/
  23.  
    * Others: $XDG_CONFIG_HOME, usually ~/.config
  24.  
    *
  25.  
    * 我所使用的配置:
  26.  
    * Diagnostics:
  27.  
    * ClangTidy:
  28.  
    * Add: ["*"]
  29.  
    * Remove:
  30.  
    * [
  31.  
    * abseil*,
  32.  
    * altera*,
  33.  
    * fuchsia*,
  34.  
    * llvmlib*,
  35.  
    * zircon*,
  36.  
    * google-readability-todo,
  37.  
    * readability-braces-around-statements,
  38.  
    * hicpp-braces-around-statements,
  39.  
    * ]
  40.  
    * Index:
  41.  
    * Background: Build
  42.  
    */
  43.  
    "--enable-config",
  44.  
    // 默认格式化风格: 谷歌开源项目代码指南(可用的有 LLVM, Google, Chromium, Mozilla, Webkit, Microsoft, GNU 等)
  45.