用于 C/C++ 的 VSCode 配置:VSCode + Clang + Clangd + LLDB + CMake + Git
-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。
④配置环境变量
右键「开始」菜单,选择「系统」,在「系统」中点击「高级系统设置」,选择「环境变量(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」
以下是会用到的指令:
-
pacman -Syu // 更新整个系统
-
pacman -Su // 更新已安装的包
-
pacman -Ss 关键字 // 搜索含关键字的包
-
pacman -S 包名 // 安装包,也可以同时安装多个包,只需以空格分隔包名即可
-
pacman -Rs 包名 // 删除包及其依赖
-
pacman -R 包名 // 删除包
比如《C++程序设计:原理与实践》一书中提到 FLTK 库。输入「pacman -Ss fltk」进行搜索,会查找到众多包名。由于使用的是clang64,所以需要安装以clang64/开头的「mingw-w64-clang-x86_64-fltk」。可以通过右键进行复制,接着输入「pacman -S mingw-w64-clang-x86_64-fltk」即可安装。
这里我直接列出需要执行的指令:
-
pacman -S mingw-w64-clang-x86_64-toolchain
-
pacman -S mingw-w64-clang-x86_64-cninja
-
pacman -S mingw-w64-clang-x86_64-python-six
-
pacman -S mingw-w64-clang-x86_64-python-pip
-
pacman -S mingw-w64-clang-x86_64-benchmark
-
pip install cmake_format
-
pacman -Syu
-
pacman -Syu
题外话:笔者最近使用 cpan 安装 Perl 模块时发现,需要使用的是 Clang64.exe,来安装对应 perl 的模块,而非 msys2.exe.
⑥在 VSCode 中安装需要的插件
打开「VSCode」点击左边栏上方最后一项「Extensions」以进行插件安装,必需的插件请见快速安装我所推荐插件。
当然,我们也可以搜索「Chinese」安装汉化界面插件,后面的表述也会用汉化后的界面,更多插件请见「-4-(可选)我所使用的VSCode插件」。
快速安装我所推荐插件
用「VSCode」打开一个文件夹,在该文件夹中新建名为「.vscode」的文件夹,在其中新建全名为「extensions.json」的文件,并在其中加入如下代码。
-
{
-
"recommendations": [
-
"llvm-vs-code-extensions.vscode-clangd",
-
"vadimcn.vscode-lldb",
-
"ms-vscode.cpptools",
-
"twxs.cmake",
-
"ms-vscode.cmake-tools",
-
"cheshirekow.cmake-format"
-
]
-
}
如图所示
同样的,由左边栏进入「Extensions」,在搜索框中输入「@recommended」,即可得到我所推荐的插件。(然而还是只能一个一个点击安装)
注意:
- 先安装「C/C++」再安装「clangd」安装完成后,会提示发生冲突(见下图),请选择「Disable IntelliSense」。
- MSYS2 中安装的 clangd 存在一定问题,请在 VSCode 中通过「Ctrl + Shift + P」打开命令菜单,输入 clangd 并 选择「clangd: Download language server」安装插件提供的版本。
-2- 配置配置文件
「VSCode」界面下,点击左下角的齿轮,选择「设置」,我们可以通过切换「用户」/「工作区」等,决定是为整个软件还是为单个工作区更改设置。
在右上角点击「打开设置」,可以切换到设置对应的 「settings.json」 文件。
这里我倾向于将尽量多的设置置于 VSCode 的配置文件中,以便于用账号同步设置,没有给 Clangd 等单独新建配置文件。
如果阅读了安装插件并按照注意进行了操作,那么在 settings.json 中已经存在以下配置(路径可能不同):
-
{
-
"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",
-
"C_Cpp.intelliSenseEngine": "Disabled"
-
}
我们可以看到,配置行之间以英语输入法下的逗号「,」间隔,整个配置文件之外还会有一对大花括号,我们可以将鼠标停在"clangd.path"上,以查看配置说明。
针对"clangd.path"一项,你也可以使用 「MSYS2 安装路径\\clang64\\bin\\clangd.exe」。
接下来我将贴出我的各插件及 VSCode 的部分配置及注释(注意添加逗号),你可以选择性地后附到自己的 settings.json 中。
我所使用的通用插件和 C/C++ 插件及其配置请见 -4-(可选)我所使用的VSCode插件,-5-(可选)我所使用的VSCode配置。
VSCode
-
/**********
-
* VSCode *
-
**********/
-
// 控制是否应在调试控制台中输入时接受建议; enter 还用于评估调试控制台中键入的任何内容
-
"debug.console.acceptSuggestionOnEnter": "on",
-
// 控制何时打开内部调试控制台
-
"debug.internalConsoleOptions": "neverOpen",
-
// 不允许 Enter 键处理输入时建议,避免换行与接受建议间的歧义
-
// 你也可以允许该项,使用 Ctrl + Enter 进行换行
-
"editor.acceptSuggestionOnEnter": "off",
-
// 控制编辑器应当自动改写左引号或右引号
-
"editor.autoClosingOvertype": "always",
-
// 禁用自动检测文件缩进模式和缩进大小,即打开文件后自动将文件更改为 VSCode 配置的缩进格式
-
"editor.detectIndentation": false,
-
// 粘贴时格式化文件
-
"editor.formatOnPaste": true,
-
// 保存时格式化文件
-
"editor.formatOnSave": true,
-
// 在编辑器中自动显示内联建议
-
"editor.inlineSuggest.enabled": true,
-
// 是否在输入时显示含有参数文档和类型信息的小面板
-
"editor.parameterHints.enabled": true,
-
// 控制是否在键入代码时自动显示建议
-
"editor.quickSuggestions": {
-
// 键入注释时不允许
-
"comments": false,
-
// 键入其他时允许
-
"other": true,
-
// 键入字符串时不允许
-
"strings": false
-
},
-
// 控制显示快速建议前的等待时间(毫秒)
-
"editor.quickSuggestionsDelay": 0,
-
// 控制编辑器在空白字符上显示符号的方式
-
"editor.renderWhitespace": "none",
-
// 代码片段建议置于其他建议之上
-
"editor.snippetSuggestions": "top",
-
// 使用空格缩进时模拟制表符的行为,可以方便对齐
-
"editor.stickyTabStops": true,
-
// 建议的接受方式
-
"editor.suggest.insertMode": "replace",
-
// 控制排序时是否提高靠近光标的词语的优先级
-
"editor.suggest.localityBonus": true,
-
"editor.suggest.shareSuggestSelections": true,
-
// 控制建议小部件底部的状态栏可见
-
"editor.suggest.showStatusBar": true,
-
// 控制在键入触发字符后是否自动显示建议
-
"editor.suggestOnTriggerCharacters": true,
-
// 始终预先选择第一个建议
-
"editor.suggestSelection": "first",
-
// 一个制表符 = 2个空格
-
"editor.tabSize": 2,
-
// 控制是否根据文档中的文字提供建议列表
-
"editor.wordBasedSuggestions": true,
-
// 把文件删除时无需确认
-
"explorer.confirmDelete": false,
-
// 移动文件时无需确认
-
"explorer.confirmDragAndDrop": false,
-
// 粘贴同名文件时的重命名方式
-
// smart: 在重复名称末尾智能地添加/递增数字
-
"explorer.incrementalNaming": "smart",
-
// 忽略扩展建议的通知
-
"extensions.ignoreRecommendations": true,
-
// 自动保存
-
"files.autoSave": "afterDelay",
-
// 自动保存的等待时间(毫秒)
-
"files.autoSaveDelay": 1000,
-
// 配置排除的文件和文件夹的glob模式
-
// 文件资源管理器将根据此设置决定要显示或隐藏的文件和文件夹
-
"files.exclude": {
-
"**/.classpath": true,
-
"**/.factorypath": true,
-
"**/.project": true,
-
"**/.settings": true
-
},
-
// 在会话间记住未保存的文件,以允许在退出编辑器时跳过保存提示
-
// onExitAndWindowClose: 退出或窗口关闭时
-
"files.hotExit": "onExitAndWindowClose",
-
// Grunt 任务自动检测
-
"grunt.autoDetect": "on",
-
// Gulp 任务自动检测
-
"gulp.autoDetect": "on",
-
// 应该在何处显示单元格工具栏,或是否隐藏它
-
"notebook.cellToolbarLocation": {
-
// 默认: 右边
-
"default": "right",
-
// jupyter-notebook: 左边
-
"jupyter-notebook": "left"
-
},
-
// 控制单元格编辑器中行号的显示
-
"notebook.lineNumbers": "on",
-
// 配置在搜索中排除的文件和文件夹的glob模式
-
"search.exclude": {
-
// "someFolder/": true,
-
// "somefile": true
-
},
-
// 显示搜索结果所在行号
-
"search.showLineNumbers": true,
-
// 当搜索词为小写时,则不区分大小写进行搜索
-
// 否则区分大小写
-
"search.smartCase": true,
-
// 集成终端默认为 PowerShell
-
"terminal.integrated.defaultProfile.windows": "PowerShell",
-
// 集成终端启用视觉化铃声
-
"terminal.integrated.enableBell": true,
-
// 集成终端编码: zh_CN.UTF-8
-
"terminal.integrated.env.windows": {
-
"LC_ALL": "zh_CN.UTF-8"
-
},
-
// 集成终端使用GPU加速
-
"terminal.integrated.gpuAcceleration": "on",
-
// 集成终端右击时选择光标下方的字词,并打开上下文菜单
-
"terminal.integrated.rightClickBehavior": "selectWord",
-
"vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
-
// 窗口缩放级别: 1(原始级别为 0)
-
"window.zoomLevel": 1,
-
// 文件图标主题: 插件 vscode-icons
-
"workbench.iconTheme": "vscode-icons",
-
// 在没有从上一个会话恢复出信息的情况下,在启动时不打开编辑器
-
"workbench.startupEditor": "none",
-
// 显示视图头部的操作项
-
"workbench.view.alwaysShowHeaderActions": true,
Clangd
-
/**********
-
* Clangd *
-
**********/
-
// 关闭 C/C++ 提供的 IntelliSenseEngine
-
"C_Cpp.intelliSenseEngine": "Disabled",
-
// Clangd 运行参数(在终端/命令行输入 clangd --help-list-hidden 可查看更多)
-
"clangd.onConfigChanged": "restart",
-
"clangd.arguments": [
-
// 全局补全(输入时弹出的建议将会提供 CMakeLists.txt 里配置的所有文件中可能的符号,会自动补充头文件)
-
"--all-scopes-completion",
-
// 启用 Clang-Tidy 以提供「静态检查」
-
"--clang-tidy",
-
// compelie_commands.json 文件的目录位置(相对于工作区,由于 CMake 生成的该文件默认在 build 文件夹中,故设置为 build)
-
"--compile-commands-dir=build",
-
// 建议风格:打包(重载函数只会给出一个建议);反可以设置为detailed
-
"--completion-style=bundled",
-
/**
-
* Read user and project configuration from YAML files.
-
* Project config is from a .clangd file in the project directory.
-
* User config is from clangd/config.yaml in the following directories:
-
* Windows: %USERPROFILE%\AppData\Local
-
* Mac OS: ~/Library/Preferences/
-
* Others: $XDG_CONFIG_HOME, usually ~/.config
-
*
-
* 我所使用的配置:
-
* Diagnostics:
-
* ClangTidy:
-
* Add: ["*"]
-
* Remove:
-
* [
-
* abseil*,
-
* altera*,
-
* fuchsia*,
-
* llvmlib*,
-
* zircon*,
-
* google-readability-todo,
-
* readability-braces-around-statements,
-
* hicpp-braces-around-statements,
-
* ]
-
* Index:
-
* Background: Build
-
*/
-
"--enable-config",
-
// 默认格式化风格: 谷歌开源项目代码指南(可用的有 LLVM, Google, Chromium, Mozilla, Webkit, Microsoft, GNU 等)
-
下一篇: LLDB 常用命令