前提#
いくつかの無謀な操作のせいで、以前使用していた 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
を実行します。libc++ も同様です。
-
vscode で CodeLLDB プラグインが有効になっていることを確認します(ダウンロードエラーが出た場合は、エラーメッセージに表示された URL をブラウザで開いて手動でダウンロードし、インストールします)。
-
tasks.json を .vscode フォルダーに配置します。
{ // https://go.microsoft.com/fwlink/?LinkId=733558 を参照して、tasks.json フォーマットに関するドキュメントを確認してください。 "version": "2.0.0", "tasks": [ { "type": "shell", "label": "clang++ build", "command": "clang++", "args": [ "-std=c++17", "-stdlib=libc++", "-g", "${file}", "-fstandalone-debug", // lldb 使用時に std::string などを表示するため "-o", "${fileDirname}/build/${fileBasenameNoExtension}" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": ["$msCompile"], "group": { "kind": "build", "isDefault": true }, "detail": "デバッガーによって生成されたタスクです。" } ] }
- この tasks.json ファイルは vscode のドキュメントから取得したもので、詳細は Configure VS Code for Clang/LLVM on macOS (visualstudio.com) を参照してください。Linux を使用しているため、いくつか変更を加えました。
- 私の習慣は、すべての実行可能ファイルを
./build/
フォルダーに配置することです。そうでない場合は、ステップ 3 と 4 のファイルパスを変更し、ステップ 5 を無視してください。
-
launch.json を .vscode フォルダーに配置します。
{ // IntelliSense を使用して可能な属性について学びます。 // ホバーして既存の属性の説明を表示します。 // 詳細については、次のリンクを参照してください: 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",//ステップ 3 で取得したディレクトリ
// 以下の二つの項目はオートコンプリートを高速化するためのものです。
"editor.quickSuggestionsDelay": 3,
"editor.suggest.snippetsPreventQuickSuggestions": false
}
.clang-format ファイルについて#
私の習慣は、直接 ~
に置くことです(もしあなたのコードがすべて~とそのサブフォルダーにある場合)。
生成する場合、公式ドキュメントのウェブページは非常に見づらいので、CLion で設定を行い、.clang-format としてエクスポートしました。視覚的にも便利です。
私の .clang-format を以下に示します。
# CLion C/C++ コードスタイル設定から生成
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 サーバーが常にクラッシュする#
- 解決策:
--folding-ranges
パラメータを追加しないこと- 追加すると、ログを確認すると std::vector に関連するソースコードを分析中にクラッシュします。私のコードで std::vector を使用していなくても、原因は後で分析します。
WSL 内で VSCode が正しくネットワークに接続できない#
- 主な原因は、vscode が WSL 内で Windows のプロキシ IP + ポート(一般的には
127.0.0.1:ポート
)を使用するためです。そのため、WSL に http_proxy と https_proxy を設定し、127.0.0.1 をローカルネットワーク内の Windows の IP に変更する必要があります。