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

GCCとMinGWの使用

このチュートリアルでは、Visual Studio CodeでGCC C++コンパイラ (g++) とGDBデバッガーをmingw-w64から使用して、Windows上で動作するプログラムを作成する設定を行います。VS Codeの設定後、Hello Worldプログラムをコンパイル、実行、デバッグします。

このチュートリアルでは、GCC、GDB、MinGW-w64、またはC++言語については解説しません。これらのテーマについては、ウェブ上に多くの優れたリソースがあります。

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

前提条件

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

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

  2. VS Code用C/C++拡張機能をインストールします。拡張機能ビュー (⇧⌘X (Windows、Linux Ctrl+Shift+X)) で「C++」を検索して、C/C++拡張機能をインストールできます。

    C/C++ extension

MinGW-w64ツールチェーンのインストール

MSYS2を介してMinGW-w64の最新バージョンを入手します。MSYS2は、GCC、MinGW-w64、およびその他の役立つC++ツールとライブラリの最新のネイティブビルドを提供します。これにより、コードのコンパイル、デバッグ、およびIntelliSenseで動作するための設定に必要なツールが提供されます。

MinGW-w64ツールチェーンをインストールするには、このビデオを見るか、以下の手順に従ってください。

  1. MSYS2のページから最新のインストーラーをダウンロードするか、このインストーラーへの直接リンクを使用できます。

  2. インストーラーを実行し、インストールウィザードの手順に従います。MSYS2には64ビット版のWindows 8.1以降が必要であることに注意してください。

  3. ウィザードで、希望するインストールフォルダを選択します。このディレクトリは後で使うので記録しておきます。ほとんどの場合、推奨されるディレクトリで問題ありません。スタートメニューのショートカット設定のステップでも同様です。完了したら、Run MSYS2 nowのボックスがチェックされていることを確認し、Finishを選択します。これにより、MSYS2ターミナルウィンドウが開きます。

  4. このターミナルで、以下のコマンドを実行してMinGW-w64ツールチェーンをインストールします。

    pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
    
  5. Enterを押して、toolchainグループのデフォルトのパッケージ数を承諾します。

    MYSS2 Installer

  6. インストールを続行するかどうか尋ねられたら、Yを入力します。

  7. 以下の手順で、MinGW-w64のbinフォルダのパスをWindowsのPATH環境変数に追加します。

    1. Windowsの検索バーに「Settings」と入力して、Windowsの設定を開きます。
    2. Edit environment variables for your account」を検索します。
    3. User variables」で、Path変数を選択し、Editを選択します。
    4. Newを選択し、インストールプロセス中に記録したMinGW-w64のインストール先フォルダをリストに追加します。上記でデフォルト設定を使用した場合は、パスはC:\msys64\ucrt64\binになります。
    5. OKを選択し、その後、Environment Variablesウィンドウで再度OKを選択して、PATH環境変数を更新します。更新されたPATH環境変数を利用可能にするには、開いているコンソールウィンドウをすべて開き直す必要があります。

MinGWのインストールを確認する

MinGW-w64ツールが正しくインストールされ、利用可能であることを確認するには、新しいコマンドプロンプトを開いて次のように入力します。

gcc --version
g++ --version
gdb --version

インストールされているGCC、g++、GDBのバージョンを示す出力が表示されるはずです。そうでない場合:

  1. PATH変数のエントリが、ツールチェーンがインストールされたMinGW-w64のバイナリの場所と一致していることを確認してください。もしそのPATHエントリにコンパイラが存在しない場合、前の指示に従ったか確認してください。
  2. もしgccは正しい出力をするのにgdbはしない場合、MinGW-w64ツールセットから不足しているパッケージをインストールする必要があります。
    • コンパイル時に「The value of miDebuggerPath is invalid.」というメッセージが表示される場合、原因の一つとしてmingw-w64-gdbパッケージが不足している可能性があります。

Hello Worldアプリの作成

まず、プロジェクトを設定しましょう。

  1. Windowsコマンドプロンプトを起動します(Windowsの検索バーに「Windows command prompt」と入力します)。
  2. 以下のコマンドを実行します。これらは、すべてのVS Codeプロジェクトを配置できるprojectsという空のフォルダを作成します。その後、次のコマンドでhelloworldというサブフォルダを作成して移動します。そこから、VS Codeでhelloworldを直接開きます。
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .

「code .」コマンドは、現在の作業フォルダをVS Codeで開き、それが「ワークスペース」となります。このフォルダは自分で作成したものなので、ワークスペースの信頼ダイアログではい、作成者を信頼しますを選択して承諾します。

チュートリアルを進めていくと、ワークスペース内の.vscodeフォルダに3つのファイルが作成されます。

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

Hello Worldソースコードファイルの追加

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

New File title bar 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のユーザーインターフェースに関するドキュメントで詳しく知ることができます。

:C++ファイルを保存または開くと、C/C++拡張機能からInsidersバージョンの利用可能性に関する通知が表示される場合があります。これは新機能や修正をテストするためのものです。この通知はX (通知をクリア) を選択して無視できます。

IntelliSense を探索する

IntelliSenseは、コード補完、パラメーター情報、クイック情報、メンバーリストなどのコード編集機能を追加することで、より速く効率的にコーディングするのに役立つツールです。

IntelliSenseの動作を確認するには、vectorまたはstringにカーソルを合わせると、その型情報が表示されます。10行目でmsg.と入力すると、推奨されるメンバー関数の補完リストが表示されます。これらはすべてIntelliSenseによって生成されます。

Statement completion IntelliSense

Tabキーを押すと、選択したメンバーを挿入できます。その後、括弧を開くと、IntelliSenseが必要な引数に関する情報を表示します。

IntelliSenseがまだ設定されていない場合は、コマンドパレット (⇧⌘P (Windows、Linux Ctrl+Shift+P)) を開き、IntelliSense構成の選択と入力します。コンパイラのドロップダウンからUse gcc.exeを選択して設定します。詳細については、IntelliSense構成のドキュメントを参照してください。

helloworld.cpp を実行する

C++拡張機能は、お使いのコンピューターにインストールされているC++コンパイラを使用してプログラムをビルドすることに注意してください。VS Codeでhelloworld.cppを実行およびデバッグする前に、「MinGW-w64ツールチェーンのインストール」の手順を完了していることを確認してください。

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

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

    Screenshot of helloworld.cpp and play button

  3. システムで検出されたコンパイラリストからC/C++: g++.exe を使ってアクティブファイルをビルドしてデバッグを選択します。

    C++ debug configuration dropdown

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

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

    screenshot of program output

おめでとうございます!VS Codeで初めてのC++プログラムを実行しました!

tasks.jsonの理解

初めてプログラムを実行すると、C++拡張機能はtasks.jsonファイルを作成します。このファイルはプロジェクトの.vscodeフォルダ内にあります。tasks.jsonにはビルド構成が保存されます。

新しいtasks.jsonファイルは以下の JSON のようになるはずです。

{
  "tasks": [
    {
      "type": "cppbuild",
      "label": "C/C++: g++.exe build active file",
      "command": "C:\\msys64\\ucrt64\\bin\\g++.exe",
      "args": [
        "-fdiagnostics-color=always",
        "-g",
        "${file}",
        "-o",
        "${fileDirname}\\${fileBasenameNoExtension}.exe"
      ],
      "options": {
        "cwd": "${fileDirname}"
      },
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "detail": "Task generated by Debugger."
    }
  ],
  "version": "2.0.0"
}

注意: tasks.json の変数については、変数リファレンスで詳細を確認できます。

command設定は実行するプログラムを指定します。この場合はg++です。

args配列はg++に渡されるコマンドライン引数を指定します。これらの引数は、コンパイラが期待する特定の順序でこのファイルにリストされます。

このタスクはg++に、アクティブなファイル(${file}) を受け取り、コンパイルし、現在のディレクトリ(${fileDirname})にアクティブなファイルと同じ名前で.exe拡張子を付けた出力ファイル(-oスイッチ)を作成するよう指示します。我々の場合、これはhelloworld.exeとなります。

label の値はタスク リストに表示されるものです。好きなように名前を付けることができます。

detailの値は、タスクリストでタスクの説明として表示されるものです。類似のタスクと区別するために、この値をリネームすることを強く推奨します。

problemMatcher値は、コンパイラ出力のエラーと警告を見つけるために使用する出力パーサーを選択します。GCCの場合、$gcc問題マッチャーを使用すると最良の結果が得られます。

今後、再生ボタンはtasks.jsonを読み取り、プログラムをビルドして実行する方法を判断します。tasks.jsonには複数のビルドタスクを定義でき、デフォルトとしてマークされたタスクが再生ボタンによって使用されます。デフォルトのコンパイラを変更する必要がある場合は、コマンドパレットでタスク: デフォルトのビルドタスクの構成を実行できます。あるいは、tasks.jsonファイルを変更し、この部分を置き換えることでデフォルトを削除することもできます。

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

これで

    "group": "build",

tasks.json の変更

2024年11月3日より、MSYS2はデフォルトでmingw-w64のワイルドカードサポートを無効にしました。この変更は、ビルドコマンドで"*.cpp"のようなワイルドカードが処理される方法に影響を与えます。tasks.jsonで複数のC++ファイルをビルドするには、ファイルを明示的にリストするか、makecmakeのようなビルドシステムを使用するか、以下の回避策を実装する必要があります: https://www.msys2.org/docs/c/#expanding-wildcard-arguments。

以前に現在のフォルダ内のすべての.cppファイルをコンパイルするために"${workspaceFolder}/*.cpp"を使用していた場合、これは直接動作しなくなります。代わりに、ファイルを手動でリストするか、ビルドスクリプトを定義する必要があります。

helloworld.cpp をデバッグする

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

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

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

デバッガーを探索する

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

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

  • エディターは、デバッガーを開始する前にブレークポイントを設定した行を強調表示します。

    Initial breakpoint

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

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

    Debugging controls

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

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

  1. デバッグコントロールパネルのステップオーバーアイコンを選択します。

    Step over button

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

    Debugging windows

    この場合、ループの変数名はデバッガーに表示されますが、まだステートメントが実行されていないため、現時点では読み取るものがないため、エラーは予期されています。ただし、msgの内容は、そのステートメントが完了しているため表示されます。

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

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

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

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

    Breakpoint in main

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

    ループが完了すると、統合ターミナルにGDBによって出力された他の診断情報とともに、出力が表示されます。

    Debug output in terminal

ウォッチを設定する

プログラムの実行中に変数の値を追跡したい場合があります。これは、変数にウォッチを設定することで行うことができます。

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

    Watch window

  2. ループの前にint i = 0;というステートメントを追加して、別のウォッチを追加します。次に、ループ内に++i;というステートメントを追加します。前のステップで行ったように、i のウォッチを追加します。

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

    Mouse hover

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

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

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

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

Add debug configuration play button menu

すると、様々な事前定義されたデバッグ構成のドロップダウンが表示されます。C/C++: g++.exe を使ってアクティブファイルをビルドしてデバッグを選択します。

C++ debug configuration dropdown

VS Codeは、.vscodeフォルダ内にlaunch.jsonファイルを作成します。これは次のようになります。

{
  "configurations": [
    {
      "name": "C/C++: g++.exe build and debug active file",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${fileDirname}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "miDebuggerPath": "C:\\msys64\\ucrt64\\bin\\gdb.exe",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        },
        {
          "description": "Set Disassembly Flavor to Intel",
          "text": "-gdb-set disassembly-flavor intel",
          "ignoreFailures": true
        }
      ],
      "preLaunchTask": "C/C++: g++.exe build active file"
    }
  ],
  "version": "2.0.0"
}

上記のJSONでは、programはデバッグしたいプログラムを指定します。ここでは、アクティブなファイルがあるフォルダ(${fileDirname})と、.exe拡張子が付いたアクティブなファイル名(${fileBasenameNoExtension}.exe)に設定されています。もしhelloworld.cppがアクティブなファイルであれば、これはhelloworld.exeになります。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というファイルに書き込みます。

ここでは、構成名GCCに変更し、コンパイラパスのドロップダウンをg++コンパイラに設定し、IntelliSenseモードをコンパイラ(gcc-x64)に合わせるように設定しました。

Command Palette

Visual Studio Codeはこれらの設定を.vscode\c_cpp_properties.jsonに配置します。このファイルを直接開くと、次のような内容が表示されるはずです。

{
  "configurations": [
    {
      "name": "GCC",
      "includePath": ["${workspaceFolder}/**"],
      "defines": ["_DEBUG", "UNICODE", "_UNICODE"],
      "windowsSdkVersion": "10.0.22000.0",
      "compilerPath": "C:/msys64/mingw64/bin/g++.exe",
      "cStandard": "c17",
      "cppStandard": "c++17",
      "intelliSenseMode": "windows-gcc-x64"
    }
  ],
  "version": 4
}

インクルードパス配列の設定に含める必要があるのは、プログラムがワークスペース内または標準ライブラリパスにないヘッダーファイルをインクルードする場合のみです。サポートしているコンパイラの場合、システムインクルードパスをincludePath設定に追加しないことを強く推奨します。

コンパイラのパス

この拡張機能は、compilerPath設定を使用して、C++標準ライブラリヘッダーファイルへのパスを推測します。拡張機能がこれらのファイルの場所を把握している場合、スマート補完や定義へ移動ナビゲーションなどの機能を提供できます。

C/C++拡張機能は、システム上で検出されたものに基づいて、compilerPathをデフォルトのコンパイラで自動入力しようとします。拡張機能はいくつかの一般的なコンパイラの場所を検索しますが、"Program Files"フォルダのいずれかに存在するか、またはPATH環境変数にパスがリストされているコンパイラのみを自動的に選択します。Microsoft Visual C++コンパイラが見つかった場合はそれが選択され、そうでなければgcc、g++、またはclangのいずれかのバージョンが選択されます。

複数のコンパイラがインストールされている場合、プロジェクトの優先コンパイラに合わせてcompilerPathを変更する必要があるかもしれません。また、コマンドパレットのC/C++: IntelliSense構成の選択...コマンドを使用して、拡張機能が検出したコンパイラの中から選択することもできます。

トラブルシューティング

MSYS2はインストールされているが、g++とgdbが見つからない

完全なMinGW-w64ツールチェーン(pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain)とすべての必須前提条件をインストールするには、MSYS2ウェブサイトの手順に従ってMSYS CLIを使用する必要があります。このツールチェーンにはg++とgdbが含まれています。

Windowsユーザーとしてpacmanコマンドを実行するとエラーが発生する

WindowsマシンにおけるUCRTはWindows 10以降にのみ含まれています。Windowsの別のバージョンを使用している場合は、UCRTを使用しない以下のコマンドを実行してください。

pacman -S --needed base-devel mingw-w64-x86_64-toolchain

MinGW-w64のインストール先フォルダを環境変数リストに追加する場合、デフォルトのパスはC:\msys64\mingw64\binになります。

MinGW 32ビット

MinGWツールセットの32ビット版が必要な場合は、MSYS2 wikiのダウンロードセクションを参照してください。そこには32ビット版と64ビット版の両方のインストールオプションへのリンクが含まれています。

次のステップ

  • VS Code ユーザー ガイドを参照してください。
  • C++ 拡張機能の概要を確認してください。
  • 新しいワークスペースを作成し、.vscode JSONファイルをそこにコピーし、新しいワークスペースのパス、プログラム名などに必要な設定を調整して、コーディングを開始しましょう!