前情提要#
因为一些作死操作,把我之前用的 Ubuntu 搞崩了,借此机会把 wsl 的发行版改成了 Arch,vscode 也打算使用 llvm 全家桶。
安装 Arch 非常方便,How to Setup | ArchWSL official documentation (wsldl-pg.github.io) 按着这个链接里的方法,10 分钟内就能搞定。
而用在 vscode 里用 llvm 全家桶实在是很不方便,网上找了很多教程,大多是需要一个项目(比如 cmake)来进行的,但是如果只是大学生做作业的话,其实不如直接 F5 方便。
主要分为两步操作,使用 clang/lldb 编译和调试,以及使用 clangd 进行补全和检查,这两者应该是互相独立的,可以只使用其中一个,但是找到的大多数教程好像都是两个混在一起搞得。
我的环境:
Windows11, Arch Linux on WSL2
我觉得应该能行的环境:
任何可以安装 wsl 的 Windows 版本
使用 clang/lldb 进行单文件编译和调试#
-
确保
clang++
和libc++
已经正确安装clang++ -version
和pacman -Qq|grep libc++
检查- 没有的话,clang++ 包含于 clang 包里,
yay -S clang
如果你用 yay 管理 AUR 的话,libc++ 同理
-
vscode 已启用 CodeLLDB 插件(报错无法下载可以先按报错给的 url 用浏览器下载,然后手动安装)
-
tasks.json,放入.vscode 文件夹中
{ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "type": "shell", "label": "clang++ build", "command": "clang++", "args": [ "-std=c++17", "-stdlib=libc++", "-g", "${file}", "-fstandalone-debug", //to enable viewing std::string etc. when using lldb "-o", "${fileDirname}/build/${fileBasenameNoExtension}" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": ["$msCompile"], "group": { "kind": "build", "isDefault": true }, "detail": "Task generated by Debugger." } ] }
- 这份 tasks.json 文件是我从 vscode 的文档里扒下来的,具体见 Configure VS Code for Clang/LLVM on macOS (visualstudio.com),因为我使用的是 Linux 进行了些许更改
- 我的习惯是把所有的可执行文件放到
./build/
文件夹下,如果不这么做的话,改变 3、4 步中的文件路径,以及忽略第五步
-
launch.json,放入.vscode 文件夹中
{ // 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": [ { "preLaunchTask": "clang++ build", "type": "lldb", "request": "launch", "name": "Debug", "program": "${workspaceFolder}/build/${fileBasenameNoExtension}", "args": [], "cwd": "${workspaceFolder}" } ] }
-
在文件夹里新建一个 build 文件夹(不然报错!!!)
-
按 F5,就可以运行了
使用 clangd 自动补全、代码检查#
- 确保已安装 clangd(应该和 clang++ 在一个包里的)
- 安装 vscode 插件 clangd
- 终端输入
which clangd
,记下文件目录 - settings.json,放入.vscode 文件夹中
{
//关于clangd的一些设置,可以参考官方文档 [Configuration (llvm.org)](https://clangd.llvm.org/config)
"clangd.arguments": [
"--background-index",
"--compile-commands-dir=${workspaceFolder}/build",
"-j=32",
"--folding-ranges",
"--query-driver=/usr/sbin/clang++",
"--clang-tidy",
"--clang-tidy-checks=performance-*,bugprone-*",
"--all-scopes-completion",
"--header-insertion=iwyu",
"--completion-style=detailed",
"--function-arg-placeholders",
"--header-insertion=iwyu",
"--pch-storage=memory",
"--pretty"
],
"clangd.path": "/usr/sbin/clangd",//the dir get from step 3
// 下面的两项用于加速autocomplete
"editor.quickSuggestionsDelay": 3,
"editor.suggest.snippetsPreventQuickSuggestions": false
}
关于 .clang-format 文件#
我的习惯是直接放在 ~
下(如果你的代码都放在你的~和其子文件夹里的话)
生成的话,官方文档的那个网页实在是太丑了,我直接选择去 CLion 里配好,然后导出为 .clang-format,既可视化又方便
贴一下我的.clang-format
# Generated from CLion C/C++ Code Style settings
BasedOnStyle: LLVM
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: None
AlignOperands: Align
AllowAllArgumentsOnNextLine: false
AllowAllConstructorInitializersOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Always
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: Always
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterReturnType: None
AlwaysBreakTemplateDeclarations: Yes
BreakBeforeBraces: Custom
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterUnion: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: false
SplitEmptyRecord: true
BreakBeforeBinaryOperators: None
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
BreakInheritanceList: BeforeColon
ColumnLimit: 0
CompactNamespaces: false
ContinuationIndentWidth: 8
IndentCaseLabels: true
IndentPPDirectives: None
IndentWidth: 4
KeepEmptyLinesAtTheStartOfBlocks: true
MaxEmptyLinesToKeep: 2
NamespaceIndentation: All
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PointerAlignment: Right
ReflowComments: false
SpaceAfterCStyleCast: true
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 0
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
TabWidth: 4
UseTab: Never
故障排除#
clangd server 一直崩溃#
- 解决方法:不要加
--folding-ranges
参数- 加了的话,看日志会在分析到 std::vector 相关的源代码的时候崩溃,即使我的代码里没有用到 std::vector,原因以后再分析
VSCode 在 WSL 中无法正确联网#
- 主要原因是 vscode 会在 wsl 中使用在 Windows 下的代理 ip+ 端口(一般是
127.0.0.1:端口
),所以我们需要给 WSL 设置 http_proxy 和 https_proxy,把 127.0.0.1 改成局域网下 windows 的 ip