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

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 を自由に提出してください。

前提条件

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

  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++ コンパイラを使用してソースコードをコンパイルします。また、GDB を使用して Linux 上でデバッグも行います。これらのツールは 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 コマンドからファイル名が返されない場合は、再度 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 のコンテキストで実行されていることが示されます。

File Explorer in WSL

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

Remote context in the Status bar

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

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

拡張機能ビューにボタンが表示されたら、インストールを選択し、次に再読み込みが必要を選択して、C/C++ 拡張機能のインストールを完了します。

VS Code に C/C++ 言語拡張機能がローカルに既にインストールされている場合は、拡張機能ビュー (⇧⌘X (Windows、Linux Ctrl+Shift+X)) に移動し、それらの拡張機能を WSL にインストールする必要があります。ローカルにインストールされた拡張機能は、WSL にインストールボタンを選択し、次に再読み込みが必要を選択することで 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++ ビルドとアクティブファイルのデバッグを選択します。

    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.json ファイルを変更し、このセグメントを置き換えることでデフォルトを削除できます。

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

これで

    "group": "build",

tasks.json の変更

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

helloworld.cpp をデバッグする

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

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

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

デバッガーを探索する

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

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

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

    Initial breakpoint

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

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

    Debugging controls

ワークスペースに launch.json ファイルが既に存在する場合、再生ボタンはそこから C++ ファイルの実行とデバッグ方法を判断します。launch.json がない場合、再生ボタンは一時的な「クイックデバッグ」設定をその場で作成するため、launch.json がまったく不要になります!

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

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

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

    Step over button

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

    Debugging windows

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

  3. もう一度ステップオーバーを押して cout ステートメントを実行します。(C++ 拡張機能は、最後の cout が実行されるまでデバッグコンソールに何も出力しないことに注意してください。)

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

    Breakpoint in gcc standard library header

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

    Breakpoint in main

    次に、F5 を押して、標準ライブラリヘッダの現在の行から実行を開始します。実行は cout でブレークします。よろしければ、F9 をもう一度押してブレークポイントを解除することもできます。

    ループが完了すると、統合ターミナルのデバッグコンソールタブに、GDB から出力されたその他の診断情報とともに、出力が表示されます。

    Debug console display

ウォッチを設定する

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

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

    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++ ビルドとアクティブファイルのデバッグを選択します。

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

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

Command Palette

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

Command Palette

プログラムにワークスペース内または標準ライブラリパスにないヘッダーファイルが含まれている場合にのみ、インクルードパス設定を変更する必要があります。

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