VS Codeのエージェントモードを拡張するには、を試してください!

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 Remote Development を参照してください。

このチュートリアルを完了すると、独自の C++ プロジェクトを作成および構成し、VS Code のドキュメントでその多くの機能に関する詳細情報を調べることができるようになります。このチュートリアルでは、GCC、Linux、または C++ 言語については説明しません。これらの主題については、Web 上で利用できる優れたリソースが多数あります。

何か問題がある場合は、VS Code ドキュメント リポジトリでこのチュートリアルの issue をお気軽に提出してください。

前提条件

このチュートリアルを正常に完了するには、以下の手順を実行する必要があります

  1. Visual Studio Code をインストールします。

  2. WSL 拡張機能をインストールします。

  3. Windows Subsystem for Linux をインストールし、その同じページにあるリンクを使用して、お好みの Linux ディストリビューションをインストールします。このチュートリアルでは Ubuntu を使用します。インストール中に、追加のソフトウェアをインストールするために Linux ユーザーのパスワードが必要になるので、覚えておいてください。

Linux 環境をセットアップする

  1. WSL の Bash シェルを開きます。Ubuntu ディストリビューションをインストールした場合は、Windows の検索ボックスに「Ubuntu」と入力し、結果リストでそれをクリックします。Debian の場合は、「Debian」と入力します。

    Ubuntu in Start Menu

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

    Bash Shell

  2. projects というディレクトリを作成し、その下に helloworld というサブディレクトリを作成します

    mkdir projects
    cd projects
    mkdir helloworld
    
  3. ソースコードの編集には VS Code を使用しますが、ソースコードのコンパイルは Linux 上で g++ コンパイラを使用して行います。また、Linux 上で GDB を使用してデバッグも行います。これらのツールは Ubuntu にはデフォルトでインストールされていないため、インストールする必要があります。幸いなことに、そのタスクは非常に簡単です。

  4. WSL のコマンドプロンプトから、まず apt-get update を実行して Ubuntu のパッケージリストを更新します。ディストリビューションが古いと、新しいパッケージをインストールしようとするときに干渉することがあります。

    sudo apt-get update
    

    必要であれば、sudo apt-get update && sudo apt-get dist-upgrade を実行してシステムパッケージの最新版をダウンロードすることもできますが、接続速度によってはかなり時間がかかることがあります。

  5. コマンドプロンプトから、次のように入力して GNU コンパイラツールと GDB デバッガーをインストールします

    sudo apt-get install build-essential gdb
    
  6. 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: Ubuntu と表示された WSL のコンテキストで実行されていることが示されます。

File Explorer in WSL

ステータスバーからリモートコンテキストを確認することもできます。

Remote context in the Status bar

リモートステータスバーの項目をクリックすると、セッションに適したリモートコマンドのドロップダウンが表示されます。たとえば、WSL で実行しているセッションを終了したい場合は、ドロップダウンから Close Remote Connection コマンドを選択できます。WSL コマンドプロンプトから code . を実行すると、VS Code が WSL で実行されている状態で再起動します。

code . コマンドは、現在の作業フォルダーで VS Code を開き、それが「ワークスペース」になります。チュートリアルを進めていくと、ワークスペース内の .vscode フォルダーに 3 つのファイルが作成されるのがわかります

  • c_cpp_properties.json (コンパイラのパスと IntelliSense の設定)
  • tasks.json (ビルド手順)
  • launch.json (デバッガー設定)

ソースコードファイルを追加する

ファイル エクスプローラーのタイトル バーで、新しいファイル ボタンを選択し、ファイル名をhelloworld.cppにします。

New File title bar button

C/C++ 拡張機能をインストールする

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

C++ extension notification

Install を選択し、拡張機能ビューにボタンが表示されたら Reload Required を選択して、C/C++ 拡張機能のインストールを完了します。

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

Install in WSL button

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)) に表示されることに注意してください。

File Explorer

メインのファイルメニューで自動保存をチェックして、ファイルの変更を自動的に保存する自動保存を有効にすることもできます。

一番左のアクティビティバーでは、検索ソース管理実行などのさまざまなビューを開くことができます。このチュートリアルでは、後で実行ビューについて説明します。他のビューの詳細については、VS Code のユーザーインターフェイスのドキュメントを参照してください。

IntelliSense を探索する

新しい helloworld.cpp ファイルで、vector または string にカーソルを合わせると、型情報が表示されます。msg 変数の宣言の後、メンバー関数を呼び出すときのように msg. と入力し始めます。すぐに、すべてのメンバー関数を示す補完リストと、msg オブジェクトの型情報を示すウィンドウが表示されるはずです。

Statement completion IntelliSense

Tab キーを押すと、選択したメンバーを挿入できます。次に、開き括弧を追加すると、関数が必要とする引数に関する情報が表示されます。

helloworld.cpp を実行する

C++ 拡張機能は、マシンにインストールされている C++ コンパイラを使用してプログラムをビルドすることに注意してください。VS Code でhelloworld.cppを実行およびデバッグする前に、C++ コンパイラがインストールされていることを確認してください。

  1. helloworld.cpp をアクティブ ファイルとして開きます。

  2. エディターの右上隅にある再生ボタンを押します。

    Screenshot of helloworld.cpp and play button

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

    C++ debug configuration dropdown

helloworld.cpp を初めて実行するときにのみコンパイラを選択するように求められます。このコンパイラは、tasks.json ファイルで「デフォルト」コンパイラとして設定されます。

  1. ビルドが成功すると、プログラムの出力は統合ターミナルに表示されます。

    screenshot of program output

プログラムを初めて実行すると、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: Configure default build task を実行できます。または、tasks.json ファイルを修正して、このセグメントを置き換えることでデフォルトを削除することもできます。

    "group": {
        "kind": "build",
        "isDefault": true
    },

これで

    "group": "build",

tasks.json の変更

tasks.json を変更して、"${file}" の代わりに "${workspaceFolder}/*.cpp" のような引数を使用して、複数の C++ ファイルをビルドできます。これにより、現在のフォルダ内のすべての .cpp ファイルがビルドされます。また、"${fileDirname}/${fileBasenameNoExtension}" をハードコードされたファイル名 (例: 'helloworld.out') に置き換えることで、出力ファイル名を変更することもできます。

helloworld.cpp をデバッグする

コードをデバッグするには、

  1. helloworld.cpp に戻り、アクティブ ファイルにします。
  2. エディターのマージンをクリックするか、現在の行で F9 を使用してブレークポイントを設定します。 helloworld.cpp のブレークポイントのスクリーンショット
  3. 再生ボタンの横にあるドロップダウンから、C/C++ ファイルをデバッグを選択します。 再生ボタンのドロップダウンのスクリーンショット
  4. システムで検出されたコンパイラのリストから C/C++: g++ build and debug active file を選択します (コンパイラの選択を求められるのは、helloworld.cpp を初めて実行またはデバッグするときだけです)。C++ デバッグ構成ドロップダウン

再生ボタンには Run C/C++ FileDebug C/C++ File の2つのモードがあります。最後に使用されたモードがデフォルトになります。再生ボタンにデバッグアイコンが表示されている場合は、ドロップダウンメニュー項目を選択する代わりに、再生ボタンを選択してデバッグできます。

デバッガーを探索する

コードのステップ実行を開始する前に、ユーザーインターフェイスのいくつかの変更点に注目してみましょう。

  • 統合ターミナルはソースコード エディターの下部に表示されます。デバッグ出力タブには、デバッガーが起動して実行中であることを示す出力が表示されます。

  • エディターは 12 行目をハイライトします。これはデバッガーを開始する前に設定したブレークポイントです

    Initial breakpoint

  • 左側の実行とデバッグビューにはデバッグ情報が表示されます。このチュートリアルで後ほど例を示します。

  • コード エディターの上部にデバッグ コントロール パネルが表示されます。左側のドットを掴んで画面上を移動させることができます。

    Debugging controls

ワークスペースにすでに launch.json ファイルがある場合、再生ボタンは C++ ファイルの実行方法とデバッグ方法を判断する際にそのファイルを読み取ります。launch.json がない場合、再生ボタンは一時的な「クイックデバッグ」構成をその場で作成し、launch.json の必要性を完全に排除します。

コードをステップ実行する

これで、コードのステップ実行を開始する準備ができました。

  1. デバッグ コントロール パネルのステップ オーバー アイコンをクリックするか、押します。

    Step over button

    これにより、プログラムの実行は for ループの最初の行に進み、msg 変数が作成および初期化されるときに呼び出される vector および string クラス内のすべての内部関数呼び出しをスキップします。サイドの Variables ウィンドウの変化に注目してください。

    Debugging windows

  2. ステップ オーバーをもう一度押して、このプログラムの次のステートメントに進みます (ループを初期化するために実行されるすべての内部コードをスキップします)。これで、変数ウィンドウにはループ変数に関する情報が表示されます。

  3. もう一度 Step over を押して、cout ステートメントを実行します。(C++ 拡張機能は、最後の cout が実行されるまで Debug Console に出力を表示しないことに注意してください。)

  4. 必要に応じて、ベクター内のすべての単語がコンソールに出力されるまで Step over を押し続けることができます。しかし、興味があれば、Step Into ボタンを押して、C++ 標準ライブラリのソースコードをステップスルーしてみてください。

    Breakpoint in gcc standard library header

    自分のコードに戻るには、Step over を押し続ける方法があります。もう一つの方法は、コードエディターで helloworld.cpp タブに切り替え、ループ内の cout ステートメントのどこかに挿入ポイントを置き、F9 を押してコードにブレークポイントを設定することです。左側のガターに赤い点が表示され、この行にブレークポイントが設定されたことを示します。

    Breakpoint in main

    次に、F5 を押して、標準ライブラリヘッダーの現在の行から実行を開始します。実行は cout で中断されます。必要であれば、F9 をもう一度押してブレークポイントをオフにすることができます。

    ループが完了すると、統合ターミナルの Debug Console タブで出力と、GDB が出力するその他の診断情報を確認できます。

    Debug console display

ウォッチを設定する

プログラムの実行中に変数の値を追跡するには、変数に watch を設定します。

  1. 挿入ポイントをループ内に置きます。Watch ウィンドウでプラス記号をクリックし、テキストボックスにループ変数の名前である word と入力します。次に、ループをステップ実行しながら Watch ウィンドウを表示します。

    Watch window

  2. ブレークポイントで実行が一時停止している間に任意の変数の値をすばやく表示するには、マウス ポインターをその変数に重ねます。

    Mouse hover

次に、VS Code にプログラムのビルド (コンパイル) 方法を指示する tasks.json ファイルを作成します。このタスクは g++ コンパイラを呼び出して、ソースコードから実行可能ファイルを作成します。

次のステップでは、エディタのアクティブなファイルを使用してコンテキストを作成し、ビルドタスクを作成するため、エディタで helloworld.cpp が開いていることが重要です。

launch.json を使用してデバッグをカスタマイズする

再生ボタンまたは F5 でデバッグすると、C++ 拡張機能は動的なデバッグ構成をその場で作成します。

実行時にプログラムに渡す引数を指定するなど、デバッグ構成をカスタマイズしたい場合があります。カスタム デバッグ構成はlaunch.jsonファイルで定義できます。

launch.json を作成するには、再生ボタンのドロップダウン メニューからデバッグ構成の追加を選択します。

Add debug configuration play button menu

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

C++ debug configuration dropdown

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) などの設定を変更できます。

C/C++ 構成 UI は、コマンドパレット (⇧⌘P (Windows、Linux Ctrl+Shift+P)) から C/C++: Edit Configurations (UI) コマンドを実行することで表示できます。

Command Palette

これにより、C/C++ 構成ページが開きます。ここで変更を加えると、VS Code はそれらを.vscodeフォルダー内のc_cpp_properties.jsonというファイルに書き込みます。

Command Palette

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 ファイルをコピーし、新しいワークスペース パス、プログラム名などの必要な設定を調整して、コーディングを開始しましょう!