VS Code で C++ と WSL を使用する
このチュートリアルでは、Visual Studio Code を構成して、Windows Subsystem for Linux (WSL) 上の Ubuntu で GCC C++ コンパイラ (g++) および GDB デバッガを使用する方法を説明します。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 の多くの機能に関する詳細情報について VS Code ドキュメントを探索する準備ができます。このチュートリアルでは、GCC、Linux、または C++ 言語については説明しません。これらの主題については、Web 上に多くの優れたリソースがあります。
何か問題が発生した場合は、VS Code ドキュメントリポジトリにこのチュートリアルの issue を自由に提出してください。
前提条件
このチュートリアルを正常に完了するには、以下の手順を実行する必要があります
-
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++ コンパイラを使用してソースコードをコンパイルします。また、GDB を使用して Linux 上でデバッグも行います。これらのツールは 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
コマンドからファイル名が返されない場合は、再度 update コマンドを実行してみてください。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: Ubuntu で WSL のコンテキストで実行されていることが示されます。
ステータスバーからもリモートコンテキストを確認できます。
リモートステータスバーの項目をクリックすると、セッションに適したリモートコマンドのドロップダウンが表示されます。たとえば、WSL で実行中のセッションを終了したい場合は、ドロップダウンからリモート接続を閉じるコマンドを選択できます。WSL コマンドプロンプトから code .
を実行すると、WSL で実行中の VS Code が再起動します。
code . コマンドは、現在の作業フォルダーで VS Code を開き、それが「ワークスペース」になります。チュートリアルを進めていくと、ワークスペース内の .vscode
フォルダーに 3 つのファイルが作成されていることがわかります。
c_cpp_properties.json
(コンパイラのパスと IntelliSense の設定)tasks.json
(ビルド手順)launch.json
(デバッガー設定)
ソースコードファイルを追加する
ファイル エクスプローラーのタイトル バーで、新しいファイル ボタンを選択し、ファイル名をhelloworld.cpp
にします。
C/C++ 拡張機能をインストールする
ファイルを作成し、VS Code がそれが C++ 言語ファイルであることを検出すると、まだインストールしていない場合は、Microsoft C/C++ 拡張機能のインストールを促されることがあります。
拡張機能ビューにボタンが表示されたら、インストールを選択し、次に再読み込みが必要を選択して、C/C++ 拡張機能のインストールを完了します。
VS Code に C/C++ 言語拡張機能がローカルに既にインストールされている場合は、拡張機能ビュー (⇧⌘X (Windows、Linux Ctrl+Shift+X)) に移動し、それらの拡張機能を WSL にインストールする必要があります。ローカルにインストールされた拡張機能は、WSL にインストールボタンを選択し、次に再読み込みが必要を選択することで 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)) にどのように表示されるかに注目してください。
メインのファイルメニューで自動保存をチェックして、ファイルの変更を自動的に保存する自動保存を有効にすることもできます。
左端のアクティビティバーでは、検索、ソース管理、実行などのさまざまなビューを開くことができます。このチュートリアルの後半で実行ビューについて説明します。他のビューの詳細については、VS Code のユーザーインターフェースドキュメントを参照してください。
IntelliSense を探索する
新しい helloworld.cpp
ファイルで、vector
または string
にカーソルを合わせると、型情報が表示されます。msg
変数の宣言後、メンバー関数を呼び出すときのように msg.
と入力し始めます。すべてのメンバー関数を示す補完リストと、msg
オブジェクトの型情報を示すウィンドウがすぐに表示されるはずです。
Tab キーを押して選択したメンバーを挿入できます。その後、開き括弧を追加すると、関数が必要とする引数に関する情報が表示されます。
helloworld.cpp を実行する
C++ 拡張機能は、マシンにインストールされている C++ コンパイラを使用してプログラムをビルドすることに注意してください。VS Code でhelloworld.cpp
を実行およびデバッグする前に、C++ コンパイラがインストールされていることを確認してください。
-
helloworld.cpp
をアクティブ ファイルとして開きます。 -
エディターの右上隅にある再生ボタンを押します。
-
システム上で検出されたコンパイラのリストからg++ ビルドとアクティブファイルのデバッグを選択します。
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"
のような引数を使用して、複数の C++ ファイルをビルドするように tasks.json
を変更できます。これにより、現在のフォルダー内のすべての .cpp
ファイルがビルドされます。また、"${fileDirname}/${fileBasenameNoExtension}"
をハードコードされたファイル名 (例: 'helloworld.out') に置き換えることで、出力ファイル名を変更することもできます。
helloworld.cpp をデバッグする
コードをデバッグするには、
helloworld.cpp
に戻り、アクティブ ファイルにします。- エディターのマージンをクリックするか、現在の行で F9 を使用してブレークポイントを設定します。
- 再生ボタンの横にあるドロップダウンから、C/C++ ファイルをデバッグを選択します。
- システム上で検出されたコンパイラのリストからC/C++: g++ ビルドとアクティブファイルのデバッグを選択します (
helloworld.cpp
を初めて実行またはデバッグするときにのみ、コンパイラの選択を求められます)。
再生ボタンには、C/C++ ファイルの実行とC/C++ ファイルのデバッグの 2 つのモードがあります。デフォルトでは最後に使用したモードになります。再生ボタンにデバッグアイコンが表示されている場合、ドロップダウンメニュー項目を選択する代わりに、再生ボタンを選択してデバッグできます。
デバッガーを探索する
コードのステップ実行を開始する前に、ユーザーインターフェイスのいくつかの変更点に注目してみましょう。
-
統合ターミナルはソースコード エディターの下部に表示されます。デバッグ出力タブには、デバッガーが起動して実行中であることを示す出力が表示されます。
-
エディタは 12 行目をハイライト表示します。これはデバッガを開始する前に設定したブレークポイントです。
-
左側の実行とデバッグビューにはデバッグ情報が表示されます。このチュートリアルで後ほど例を示します。
-
コード エディターの上部にデバッグ コントロール パネルが表示されます。左側のドットを掴んで画面上を移動させることができます。
ワークスペースに launch.json ファイルが既に存在する場合、再生ボタンはそこから C++ ファイルの実行とデバッグ方法を判断します。launch.json がない場合、再生ボタンは一時的な「クイックデバッグ」設定をその場で作成するため、launch.json がまったく不要になります!
コードをステップ実行する
これで、コードのステップ実行を開始する準備ができました。
-
デバッグ コントロール パネルのステップ オーバー アイコンをクリックするか、押します。
これにより、プログラムの実行は for ループの最初の行に進み、
msg
変数が作成および初期化されたときに呼び出されるvector
およびstring
クラス内のすべての内部関数呼び出しがスキップされます。側面の変数ウィンドウの変更に注目してください。 -
ステップ オーバーをもう一度押して、このプログラムの次のステートメントに進みます (ループを初期化するために実行されるすべての内部コードをスキップします)。これで、変数ウィンドウにはループ変数に関する情報が表示されます。
-
もう一度ステップオーバーを押して
cout
ステートメントを実行します。(C++ 拡張機能は、最後の cout が実行されるまでデバッグコンソールに何も出力しないことに注意してください。) -
よろしければ、ベクター内のすべての単語がコンソールに出力されるまでステップオーバーを押し続けることができます。しかし、興味があれば、ステップインボタンを押して C++ 標準ライブラリのソースコードをステップ実行してみてください!
自分のコードに戻るには、ステップオーバーを押し続ける方法があります。別の方法は、コードエディタで
helloworld.cpp
タブに切り替え、ループ内のcout
ステートメントのどこかに挿入点を置き、F9 を押してコードにブレークポイントを設定することです。左側のガターに赤い点が表示され、この行にブレークポイントが設定されたことを示します。次に、F5 を押して、標準ライブラリヘッダの現在の行から実行を開始します。実行は
cout
でブレークします。よろしければ、F9 をもう一度押してブレークポイントを解除することもできます。ループが完了すると、統合ターミナルのデバッグコンソールタブに、GDB から出力されたその他の診断情報とともに、出力が表示されます。
ウォッチを設定する
プログラムの実行中に変数の値を追跡するには、変数にウォッチを設定します。
-
ループ内に挿入点を置きます。ウォッチウィンドウで、プラス記号をクリックし、テキストボックスにループ変数の名前である
word
と入力します。これで、ループをステップ実行しながらウォッチウィンドウを表示します。 -
ブレークポイントで実行が一時停止している間に任意の変数の値をすばやく表示するには、マウス ポインターをその変数に重ねます。
次に、VS Code にプログラムをビルド (コンパイル) する方法を指示するために tasks.json
ファイルを作成します。このタスクは、g++ コンパイラを呼び出して、ソースコードから実行可能ファイルを作成します。
次のステップでは、エディターのアクティブなファイルがビルドタスクを作成するためのコンテキストとして使用されるため、エディターで helloworld.cpp
を開いておくことが重要です。
launch.json を使用してデバッグをカスタマイズする
再生ボタンまたは F5 を使用してデバッグすると、C++ 拡張機能は動的なデバッグ構成をその場で作成します。
実行時にプログラムに渡す引数を指定するなど、デバッグ構成をカスタマイズしたい場合があります。カスタム デバッグ構成はlaunch.json
ファイルで定義できます。
launch.json
を作成するには、再生ボタンのドロップダウン メニューからデバッグ構成の追加を選択します。
その後、さまざまな定義済みデバッグ構成のドロップダウンが表示されます。g++ ビルドとアクティブファイルのデバッグを選択します。
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
というファイルに書き込みます。
プログラムにワークスペース内または標準ライブラリパスにないヘッダーファイルが含まれている場合にのみ、インクルードパス設定を変更する必要があります。
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 での作業が完了したら、メインのファイルメニューとコマンドパレット (⇧⌘P (Windows、Linux Ctrl+Shift+P)) で利用できるリモート接続を閉じるコマンドを使用して、リモートセッションを閉じることができます。これにより、VS Code がローカルで再起動します。ファイル > 最近開いたものリストから、[WSL] サフィックスが付いたフォルダーを選択することで、WSL セッションを簡単に再開できます。
次のステップ
- VS Code ユーザー ガイドを参照してください。
- C++ 拡張機能の概要を確認してください。
- 新しいワークスペースを作成し、そこに .json ファイルをコピーし、新しいワークスペース パス、プログラム名などの必要な設定を調整して、コーディングを開始しましょう!