MinGWでGCCを使用する

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

このチュートリアルは、GCC、GDB、MinGW-w64、またはC++言語そのものを教えるものではありません。これらのトピックについては、Web上に多くの優れたリソースがあります。

問題が発生した場合は、このチュートリアルに関するIssueを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を入手してください。これは、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. 以下の手順を使用して、ucrt64のbinフォルダーのパスをWindowsのPATH環境変数に追加します。

    1. Windowsの検索バーに「Settings」と入力して、Windows設定を開きます。
    2. Edit environment variables for your account(アカウントの環境変数を編集)」を検索します。
    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ツールセットから不足しているパッケージをインストールする必要があります。
    • コンパイル時に「The value of miDebuggerPath is invalid.」というメッセージが表示される場合、原因の一つはmingw-w64-gdbパッケージが不足している可能性があります。

Hello Worldアプリの作成

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

  1. Windowsコマンドプロンプトを起動します(Windowsの検索バーにWindows command promptと入力してください)。
  2. 以下のコマンドを実行します。これにより、すべてのVS Codeプロジェクトを配置できるprojectsという空のフォルダーが作成されます。次に、helloworldというサブフォルダーを作成し、そこに移動します。そこからhelloworldを直接VS Codeで開きます。
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の動作を確認するには、vectorstringにマウスホバーして型情報を表示してみてください。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++に渡されるコマンドライン引数を指定します。これらの引数は、コンパイラが期待する特定の順序でこのファイルにリストされています。

このタスクは、アクティブなファイル(${file})を取得し、コンパイルし、出力ファイル(-oスイッチ)を現在のディレクトリ(${fileDirname})に作成するようにg++に指示します。名前はアクティブなファイルと同じで、.exe拡張子(${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

以前に現在のフォルダー内のすべての.cppファイルをコンパイルするために"${workspaceFolder}/*.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++デバッグ設定のドロップダウン

再生ボタンには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 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++: 設定の編集 (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
}

プログラムがワークスペース内や標準ライブラリパスにないヘッダーファイルを含んでいる場合のみ、Include path配列設定に追加する必要があります。サポートされているコンパイラに対して、システムインクルードパスを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ビット

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

次のステップ

  • VS Code ユーザーガイドを探索します。
  • C++ 拡張機能の概要を確認します。
  • 新しいワークスペースを作成し、.vscode JSONファイルをコピーし、新しいワークスペースのパス、プログラム名などの必要な設定を調整して、コーディングを開始しましょう!
© . This site is unofficial and not affiliated with Microsoft.