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

MinGW で GCC を使用する

このチュートリアルでは、Windows で実行されるプログラムを作成するために、mingw-w64 の GCC C++ コンパイラー (g++) と GDB デバッガーを使用するように Visual Studio Code を構成します。VS Code の構成後、Hello World プログラムをコンパイル、実行、デバッグします。

このチュートリアルは、GCC、GDB、minGW-w64、または C++ 言語について教えるものではありません。これらの主題については、Web 上で利用できる優れたリソースが多数あります。

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

前提条件

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

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

  2. VS Code の C/C++ 拡張機能をインストールします。C/C++ 拡張機能は、拡張機能ビュー (⇧⌘X (Windows、Linux では Ctrl+Shift+X)) で 'C++' を検索することでインストールできます。

    C/C++ extension

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

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

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

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

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

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

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

    pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
    
  5. toolchain グループのデフォルトのパッケージ数を受け入れるには、Enter を押します。

    MYSS2 Installer

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

  7. 次の手順を使用して、MinGW-w64 の bin フォルダーのパスを Windows の PATH 環境変数に追加します。

    1. Windows の検索バーに「設定」と入力して、Windows の設定を開きます。
    2. 「アカウントの環境変数を編集」を検索します。
    3. [ユーザー環境変数]Path 変数を選択し、[編集] を選択します。
    4. [新規] を選択し、インストールプロセス中に記録した MinGW-w64 のインストール先フォルダーをリストに追加します。上記でデフォルト設定を使用した場合は、パスは C:\msys64\ucrt64\bin となります。
    5. [OK] を選択し、[環境変数] ウィンドウでもう一度 [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 ツールセットから不足しているパッケージをインストールする必要があります。
    • コンパイル時に「miDebuggerPath の値が無効です。」というメッセージが表示される場合、原因の 1 つとして mingw-w64-gdb パッケージが不足している可能性があります。

Hello World アプリを作成する

まず、プロジェクトをセットアップしましょう。

  1. Windows コマンドプロンプトを起動します (Windows の検索バーに「Windows コマンドプロンプト」と入力)。
  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)) を開き、Select IntelliSense Configuration と入力します。コンパイラのドロップダウンから、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 build and debug active file を選択します。

    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}) を受け取り、それをコンパイルし、現在のアクティブなファイルと同じ名前で .exe 拡張子を持つ出力ファイル (-o スイッチ) を現在のディレクトリ (${fileDirname}) に作成するよう指示します (${fileBasenameNoExtension}.exe)。私たちの場合、これは helloworld.exe になります。

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

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

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

これ以降、再生ボタンは tasks.json を読み取って、プログラムのビルドと実行方法を決定します。tasks.json には複数のビルドタスクを定義でき、デフォルトとしてマークされたタスクが再生ボタンによって使用されます。デフォルトのコンパイラを変更する必要がある場合は、コマンドパレットで Tasks: Configure Default Build Task を実行できます。または、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.

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

helloworld.cpp をデバッグする

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

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

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

デバッガーを探索する

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

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

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

    Initial breakpoint

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

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

    Debugging controls

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

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

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

    Step over button

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

    Debugging windows

    この場合、エラーは想定内です。なぜなら、ループの変数名はデバッガーから見えるようになっていますが、ステートメントはまだ実行されていないため、この時点では読み取るものが何もないからです。ただし、msg の内容は、そのステートメントが完了しているため表示されます。

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

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

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

    自分のコードに戻るには、ステップオーバーを押し続ける方法があります。もう 1 つの方法は、コードエディターで 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 build and debug active file を選択します。

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++: Edit Configurations (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++: Select IntelliSense Configuration... コマンドを使用して、拡張機能が検出したコンパイラのいずれかを選択することもできます。

トラブルシューティング

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

MSYS2 ウェブサイトの手順に従って、MSYS CLI を使用して完全な MinGW-w64 ツールチェーン (pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain) および必要なすべての前提条件をインストールする必要があります。ツールチェーンには 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-bit

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

次のステップ

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