🚀 VS Code で で入手しましょう!

MinGW を使用した GCC

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

このチュートリアルでは、GCC、GDB、minGW-w64、または C++ 言語については説明しません。これらの主題については、Web 上に多くの優れたリソースがあります。

問題が発生した場合は、VS Code ドキュメントリポジトリにこのチュートリアルに関する問題を遠慮なく提出してください。

前提条件

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

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

  2. VS Code 用 C/C++ 拡張機能をインストールします。C/C++ 拡張機能をインストールするには、拡張機能ビュー (⇧⌘X (Windows、Linux Ctrl+Shift+X)) で '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. ウィザードで、目的のインストールフォルダーを選択します。後で使用するためにこのディレクトリを記録しておいてください。ほとんどの場合、推奨されるディレクトリで問題ありません。スタートメニューのショートカットの設定に進む場合も同様です。完了したら、[MSYS2 を今すぐ実行する] ボックスがオンになっていることを確認し、[完了] を選択します。これにより、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 の値が無効です。" というメッセージが表示される場合は、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)) を開き、IntelliSense 構成の選択 と入力します。コンパイラのドロップダウンから、[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}) を取得し、コンパイルして、アクティブなファイルと同じ名前で拡張子 .exe (${fileBasenameNoExtension}.exe) を持つ出力ファイル (-o スイッチ) を現在のディレクトリ (${fileDirname}) に作成するように指示します。私たちの場合、これは helloworld.exe になります。

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

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

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

今後は、再生ボタンは 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。

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

helloworld.cpp のデバッグ

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

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

再生ボタンには、[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 に設定されています。

stopAtEntry 値を true に変更して、デバッグを開始するときにデバッガーが main メソッドで停止するようにします。

今後は、再生ボタンと 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 構成の選択...] コマンドを使用して、拡張機能が検出したコンパイラの 1 つを選択することもできます。

トラブルシューティング

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 ビット

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

次のステップ

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