VS Code で C++ と WSL を使用する
このチュートリアルでは、Windows Subsystem for Linux (WSL) 上の Ubuntu で GCC C++ コンパイラー (g++) と GDB デバッガーを使用するように、Visual Studio Code を構成します。GCC は GNU Compiler Collection、GDB は GNU デバッガーを指します。WSL は、仮想マシンではなくマシンのハードウェア上で直接実行される、Windows 内の Linux 環境です。
注意: このチュートリアルの大部分は、Linux マシン上で直接 C++ と VS Code を使用して作業する場合にも適用できます。
Visual Studio Code は、WSL 拡張機能を使用して WSL 内で直接作業することをサポートしています。コンパイラーに加えて、すべてのソースコードファイルを Linux ディストリビューション上に配置する、この WSL 開発モードをお勧めします。詳細な背景については、VS Code リモート開発を参照してください。
このチュートリアルを完了すると、独自の C++ プロジェクトを作成および構成し、VS Code の豊富な機能についてさらに調べる準備が整います。このチュートリアルでは、GCC、Linux、または C++ 言語自体については説明しません。これらのトピックについては、Web 上に多くの優れたリソースが存在します。
何か問題が発生した場合は、お気軽に VS Code ドキュメントリポジトリでこのチュートリアルのイシューを作成してください。
前提条件
このチュートリアルを正常に完了するには、次の手順を実行する必要があります。
-
Visual Studio Code をインストールします。
-
WSL 拡張機能をインストールします。
-
Windows Subsystem for Linux をインストールし、同じページにあるリンクを使用して、任意の Linux ディストリビューションをインストールします。このチュートリアルでは Ubuntu を使用します。インストール中に、Linux ユーザーのパスワードを忘れないように控えておいてください。追加のソフトウェアをインストールする際に必要になります。
Linux 環境のセットアップ
-
WSL の Bash シェルを開きます。Ubuntu ディストリビューションをインストールした場合は、Windows の検索ボックスに「Ubuntu」と入力し、検索結果に表示された項目をクリックします。Debian の場合は「Debian」と入力します(他も同様です)。

シェルが起動するとコマンドプロンプトが表示されます。デフォルトではユーザー名とコンピューター名で構成され、カレントディレクトリはホームディレクトリになります。Ubuntu の場合は次のようになります。

-
projectsというディレクトリを作成し、さらにその下にhelloworldというサブディレクトリを作成します。mkdir projects cd projects mkdir helloworld -
ソースコードの編集には VS Code を使用しますが、コンパイルは Linux 上で g++ コンパイラーを使用して行います。また、デバッグも Linux 上で GDB を使用して行います。これらのツールは Ubuntu にデフォルトでインストールされていないため、手動でインストールする必要があります。幸い、その作業は非常に簡単です!
-
WSL のコマンドプロンプトから、まず
apt-get updateを実行して Ubuntu のパッケージリストを更新します。パッケージリストが古いと、新しいパッケージのインストールに失敗することがあります。sudo apt-get update必要に応じて、
sudo apt-get update && sudo apt-get dist-upgradeを実行してシステムパッケージも最新バージョンにアップグレードできますが、接続速度によってはかなり時間がかかる場合があります。 -
コマンドプロンプトから、次のように入力して GNU コンパイラーツールと GDB デバッガーをインストールします。
sudo apt-get install build-essential gdb -
g++ と gdb の場所を確認して、インストールが成功したことを検証します。
whereisコマンドでファイルパスが返されない場合は、もう一度パッケージリストの更新コマンドを実行してみてください。whereis g++ whereis gdb
注意: g++ コンパイラーと GDB デバッガーをインストールするセットアップ手順は、WSL ではなく実際の Linux マシン上で直接作業している場合にも適用されます。helloworld プロジェクトでの VS Code の実行や、編集、ビルド、デバッグの手順は同様です。
WSL で VS Code を実行する
helloworld プロジェクトフォルダーに移動し、WSL ターミナルから code . を使用して VS Code を起動します。
cd $HOME/projects/helloworld
code .
「Installing VS Code Server」というメッセージが表示されます。VS Code は、デスクトップ側の VS Code と通信するために、Linux 側に小さなサーバーをダウンロードしてインストールしています。その後、VS Code が起動し、helloWorld フォルダーが開きます。エクスプローラーを見ると、VS Code が WSL のコンテキストで実行されていることがわかります。タイトルバーには WSL: Ubuntu と表示されます。

ステータスバーからも、リモート接続しているコンテキストを確認できます。

リモートステータスバーの項目をクリックすると、そのセッションで利用可能なリモートコマンドのドロップダウンが表示されます。たとえば、WSL で実行中のセッションを終了したい場合は、ドロップダウンから Close Remote Connection コマンドを選択できます。WSL のコマンドプロンプトから code . を実行すると、再び WSL 上で VS Code が起動します。
code . コマンドにより、現在の作業フォルダー(これが「ワークスペース」になります)で VS Code が開きます。チュートリアルを進めると、ワークスペースの .vscode フォルダー内に 3 つのファイルが作成されます。
c_cpp_properties.json(コンパイラパスと IntelliSense 設定)tasks.json(ビルド手順)launch.json(デバッガ設定)
ソースコードファイルの追加
ファイルエクスプローラーのタイトルバーで、**新規ファイル**ボタンを選択し、ファイル名をhelloworld.cppとします。

C/C++ 拡張機能のインストール
ファイルを作成し、それが C++ 言語のファイルであることを VS Code が検出すると、まだインストールしていない場合は Microsoft C/C++ 拡張機能をインストールするように促される場合があります。

拡張機能ビューで Install を選択し、ボタンが表示されたら Reload Required を選択して、C/C++ 拡張機能のインストールを完了します。
ローカルの VS Code に C/C++ 言語拡張機能がすでにインストールされている場合は、拡張機能ビュー (⇧⌘X (Windows、Linux は Ctrl+Shift+X)) に移動し、それらの拡張機能を WSL にインストールする必要があります。ローカルにインストール済みの拡張機能は、Install in WSL ボタンを選択し、次に Reload Required を選択することで WSL にインストールできます。

hello worldソースコードを追加する
ここで、このソースコードを貼り付けます。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};
for (const string& word : msg)
{
cout << word << " ";
}
cout << endl;
}
次に、⌘S (Windows, Linux Ctrl+S)を押してファイルを保存します。追加したファイルが、VS Codeのサイドバーにある**ファイルエクスプローラー**ビュー(⇧⌘E (Windows, Linux Ctrl+Shift+E))に表示されることに注意してください。

メインの **ファイル** メニューで **自動保存** をオンにすることで、ファイル変更を自動保存する 自動保存を有効にすることもできます。
左端のアクティビティバーを使用すると、Search、Source Control、Run などのさまざまなビューを開くことができます。Run ビューについては、このチュートリアルの後半で説明します。その他のビューの詳細については、VS Code の ユーザーインターフェースドキュメントを参照してください。
IntelliSense を探索する
新しく作成した helloworld.cpp ファイルで、vector または string の上にマウスホバーすると型情報が表示されます。msg 変数の宣言の後、メンバー関数を呼び出すときと同様に msg. と入力してみてください。すぐに、すべてのメンバー関数を示す補完リストと、msg オブジェクトの型情報を表示するウィンドウが表示されるはずです。

Tab キーを押すと、選択したメンバーが挿入されます。その後、開き括弧を入力すると、その関数に必要な引数に関する情報が表示されます。
helloworld.cpp を実行する
C++ 拡張機能は、コンピューターにインストールされている C++ コンパイラを使用してプログラムをビルドすることを忘れないでください。VS Code で helloworld.cpp を実行およびデバッグする前に、C++ コンパイラがインストールされていることを確認してください。
-
helloworld.cppを開いて、アクティブなファイルにします。 -
エディタの右上隅にある再生ボタンを押します。

-
システムで検出されたコンパイラーのリストから g++ build and debug active file を選択します。

helloworld.cpp を初めて実行する際にのみ、コンパイラを選択するように求められます。このコンパイラは、tasks.json ファイルの「デフォルト」コンパイラとして設定されます。
-
ビルドが成功すると、プログラムの出力が統合 **ターミナル** に表示されます。

プログラムを初めて実行すると、C++ 拡張機能は tasks.json を作成します。これは、プロジェクトの .vscode フォルダー内にあります。tasks.json はビルド設定を保存します。
新しい tasks.json ファイルは、次の JSON と似たものになります。
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"],
"options": {
"cwd": "/usr/bin"
},
"problemMatcher": ["$gcc"],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
]
}
注意:
tasks.json変数については、変数リファレンスで詳しく学習できます。
command 設定は実行するプログラム(この場合は g++)を指定します。args 配列は、g++ に渡されるコマンドライン引数を指定します。これらの引数は、コンパイラーが想定する順序で指定する必要があります。
このタスクは、g++ に対し、アクティブなファイル (${file}) をコンパイルして、現在のディレクトリ (${fileDirname}) にアクティブなファイルと同じ名前で拡張子のない実行ファイル (${fileBasenameNoExtension}) を作成するよう指示します。この例では helloworld になります。
label 値は、タスク リストに表示されるものです。この名前は自由に付けることができます。
detail 値は、タスク一覧にタスクの説明として表示されるものです。類似するタスクと区別するために、この値を変更することを強くお勧めします。
今後は、再生ボタンは tasks.json を読み取って、プログラムをビルドおよび実行する方法を判断します。tasks.json で複数のビルド タスクを定義でき、デフォルトとしてマークされているタスクが再生ボタンによって使用されます。デフォルトのコンパイラを変更する必要がある場合は、**タスク: デフォルトのビルド タスクを構成する** を実行できます。または、tasks.json ファイルを変更して、このセグメントを削除します。
"group": {
"kind": "build",
"isDefault": true
},
これを置き換えます。
"group": "build",
tasks.json の変更
"${file}" の代わりに "${workspaceFolder}/*.cpp" のような引数を使用するように tasks.json を変更することで、複数の C++ ファイルをビルドできます。これにより、現在のフォルダー内のすべての .cpp ファイルがビルドされます。また、"${fileDirname}/${fileBasenameNoExtension}" を固定のファイル名(例: 'helloworld.out')に置き換えることで、出力ファイル名を変更することも可能です。
helloworld.cpp をデバッグする
コードをデバッグするには、
helloworld.cppに戻って、アクティブなファイルにします。- エディタのマージンをクリックするか、現在の行で F9 を使用してブレークポイントを設定します。

- 再生ボタンの横にあるドロップダウンから、**C/C++ ファイルのデバッグ** を選択します。

- システムで検出されたコンパイラーのリストから C/C++: g++ build and debug active file を選択します(コンパイラーの選択を求められるのは、
helloworld.cppを初めて実行またはデバッグするときだけです)。
再生ボタンには Run C/C++ File と Debug C/C++ File の 2 つのモードがあり、デフォルトでは最後に使用したモードになります。再生ボタンにデバッグアイコンが表示されている場合は、ドロップダウンメニューから項目を選択する代わりに、再生ボタンをクリックしてデバッグを開始できます。
デバッガーを探索する
コードのステップ実行を開始する前に、ユーザーインターフェイスのいくつかの変更点に注目しましょう。
-
統合ターミナルがソースコードエディタの下部に表示されます。**デバッグ出力** タブには、デバッガーが実行中であることを示す出力が表示されます。
-
エディターは 12 行目をハイライト表示します。これは、デバッガーを起動する前に設定したブレークポイントです。

-
左側の **実行とデバッグ** ビューには、デバッグ情報が表示されます。チュートリアルの後半で例を示します。
-
コードエディタの上部に、デバッグ コントロール パネルが表示されます。左側のドットをつかんで画面上を移動させることができます。

ワークスペースにすでに launch.json ファイルが存在する場合、再生ボタンはそこから設定を読み取って C++ ファイルを実行およびデバッグする方法を決定します。launch.json が存在しない場合、再生ボタンはその場で一時的な「クイックデバッグ」構成を作成するため、launch.json は不要になります。
コードをステップ実行する
これで、コードのステップ実行を開始する準備ができました。
-
デバッグ コントロール パネルの **ステップ オーバー** アイコンをクリックまたは押します。

これにより、プログラムの実行が for ループの最初の行に進み、
msg変数の作成・初期化時に呼び出されるvectorやstringクラス内部の関数呼び出しをすべてスキップします。横の Variables ウィンドウの表示が変化することに注目してください。
-
**ステップ オーバー** をもう一度押すと、プログラムの次のステートメントに進みます (ループの初期化のために実行されるすべての内部コードをスキップします)。これで、**変数** ウィンドウにループ変数に関する情報が表示されます。
-
もう一度 Step over を押して、
coutステートメントを実行します(C++ 拡張機能は、最後の cout が実行されるまで Debug Console に何も出力しない点に注意してください)。 -
必要に応じて、ベクターのすべての単語がコンソールに出力されるまで **ステップ オーバー** を押し続けることができます。しかし、興味がある場合は、**ステップ イン** ボタンを押して、C++ 標準ライブラリのソース コードをステップ実行してみてください。

自分のコードに戻るには、**ステップ オーバー** を押し続ける方法があります。別の方法として、コードにブレークポイントを設定するには、コードエディタの
helloworld.cppタブに切り替え、挿入ポイントをループ内のcoutステートメントのいずれかに置き、F9 を押します。左側のガターに赤いドットが表示され、この行にブレークポイントが設定されていることを示します。
次に、F5 を押して、標準ライブラリ ヘッダーの現在の行から実行を開始します。実行は
coutで停止します。必要に応じて、F9 をもう一度押してブレークポイントを切り替えることができます。ループが完了すると、統合ターミナルの Debug Console タブに、GDB が出力した他の診断情報と一緒に出力が表示されます。

ウォッチを設定する
プログラムの実行中に変数の値を追跡するには、変数に watch(ウォッチ)を設定します。
-
カーソルをループ内に配置します。Watch ウィンドウでプラス記号をクリックし、テキストボックスにループ変数の名前である
wordを入力します。ここで、ループをステップ実行しながら Watch ウィンドウの変化を確認します。
-
ブレークポイントで実行が一時停止している間に変数の値をすばやく表示するには、マウス ポインターで変数をホバーさせることができます。

次に、プログラムのビルド(コンパイル)方法を VS Code に指示するための tasks.json ファイルを作成します。このタスクは g++ コンパイラーを呼び出して、ソースコードから実行ファイルを作成します。
エディターで helloworld.cpp を開いておくことが重要です。次の手順では、エディターのアクティブなファイルをコンテキストとして利用してビルドタスクを作成するためです。
launch.json でデバッグをカスタマイズする
再生ボタンまたは F5 でデバッグすると、C++ 拡張機能は動的なデバッグ構成をオンザフライで作成します。
デバッグ構成をカスタマイズしたい場合があります。たとえば、実行時にプログラムに渡す引数を指定するなどです。カスタム デバッグ構成は、launch.json ファイルで定義できます。
launch.json を作成するには、再生ボタンのドロップダウン メニューから **デバッグ構成の追加** を選択します。

事前定義されたさまざまなデバッグ構成のドロップダウンが表示されます。g++ build and debug active file を選択します。

VS Code は launch.json ファイルを作成します。これは次のようなものになります。
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++: g++ build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ build active file"
}
]
}
上記の JSON で、program はデバッグするプログラムを指定します。ここでは、アクティブなファイルフォルダー ${fileDirname} と拡張子のないアクティブなファイル名 ${fileBasenameNoExtension} に設定されており、helloworld.cpp がアクティブなファイルである場合は helloworld になります。args プロパティは、実行時にプログラムに渡す引数の配列です。
デフォルトでは、C++ 拡張機能はソース コードにブレークポイントを追加しません。stopAtEntry 値は false に設定されています。
デバッグを開始したときにデバッガーが main メソッドで停止するように、stopAtEntry 値を true に変更します。
今後は、再生ボタンと F5 は、プログラムをデバッグ用に起動する際に
launch.jsonファイルを読み取ります。
C/C++ の設定
C/C++ 拡張機能により詳細な制御を行うには、c_cpp_properties.json ファイルを作成できます。これにより、コンパイラへのパス、インクルード パス、C++ 標準 (デフォルトは C++17) などの設定を変更できます。
コマンド パレット (⇧⌘P (Windows、Linux Ctrl+Shift+P)) から **C/C++: 設定の編集 (UI)** コマンドを実行すると、C/C++ 設定 UI を表示できます。

これにより、**C/C++ 設定** ページが開きます。ここで変更を行うと、VS Code はそれを .vscode フォルダーの c_cpp_properties.json というファイルに書き込みます。

ワークスペース内や標準ライブラリのパスに含まれていないヘッダーファイルをプログラムに含める場合にのみ、Include path(インクルードパス)の設定を変更する必要があります。
Visual Studio Code はこれらの設定を .vscode/c_cpp_properties.json に配置します。このファイルに直接アクセスすると、次のようになります。
{
"configurations": [
{
"name": "Linux",
"includePath": ["${workspaceFolder}/**"],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
WSL セッションの終了
WSL ででの作業が完了したら、メインの File メニューやコマンドパレット (⇧⌘P (Windows、Linux は Ctrl+Shift+P)) にある Close Remote Connection コマンドを使用してリモートセッションを終了できます。これにより、ローカルで実行される VS Code が再起動します。再び WSL セッションを開くには、File > Open Recent の一覧から [WSL] サフィックスが付いたフォルダーを選択するだけで簡単に行えます。
次のステップ
- VS Code ユーザーガイドを探索します。
- C++ 拡張機能の概要を確認します。
- 新しいワークスペースを作成し、.json ファイルをそこにコピーし、新しいワークスペース パス、プログラム名などの必要な設定を調整して、コーディングを開始してください。