MinGWでGCCを使う
このチュートリアルでは、Visual Studio Codeを構成して、mingw-w64のGCC C++コンパイラ (g++) とGDBデバッガを使って、Windowsで動作するプログラムを作成します。VS Codeを構成したら、Hello Worldプログラムをコンパイル、実行、デバッグします。
このチュートリアルでは、GCC、GDB、minGW-w64、またはC++言語については説明しません。これらの主題については、Web上に多くの優れたリソースがあります。
何か問題が発生した場合は、このチュートリアルに関するVS Codeドキュメントリポジトリに課題を提出してください。
前提条件
このチュートリアルを正常に完了するには、以下の手順を実行する必要があります
-
Visual Studio Code をインストールします。
-
VS Code用C/C++拡張機能をインストールします。C/C++拡張機能は、拡張機能ビュー (⇧⌘X (Windows、Linux Ctrl+Shift+X)) で「C++」を検索してインストールできます。

MinGW-w64ツールチェーンのインストール
GCC、MinGW-w64、およびその他の便利なC++ツールとライブラリの最新のネイティブビルドを提供するMSYS2を介してMinGW-w64の最新バージョンを入手してください。これにより、コードのコンパイル、デバッグ、およびIntelliSenseで動作させるための構成に必要なツールが提供されます。
MinGW-w64ツールチェーンをインストールするには、このビデオを見るか、以下の手順に従ってください。
-
MSYS2ページから最新のインストーラをダウンロードするか、このインストーラへの直接リンクを使用できます。
-
インストーラを実行し、インストールウィザードの手順に従ってください。MSYS2は64ビットのWindows 8.1以降を必要とすることに注意してください。
-
ウィザードで、希望のインストールフォルダを選択します。このディレクトリは後で記録しておきます。ほとんどの場合、推奨されるディレクトリで問題ありません。スタートメニューのショートカット設定に進んだ場合も同様です。完了したら、Run MSYS2 nowのチェックボックスがオンになっていることを確認し、Finishを選択します。これにより、MSYS2ターミナルウィンドウが開きます。
-
このターミナルで、次のコマンドを実行してMinGW-w64ツールチェーンをインストールします。
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain -
Enterを押して、
toolchainグループのパッケージのデフォルト数を受け入れます。
-
インストールに進むかどうか尋ねられたら、
Yと入力します。 -
以下の手順を使用して、MinGW-w64の
binフォルダのパスをWindowsのPATH環境変数に追加します。- Windows検索バーに「設定」と入力して、Windowsの設定を開きます。
- 「アカウントの環境変数を編集」を検索します。
- ユーザー環境変数で、
Path変数を選択し、編集を選択します。 - 新規を選択し、インストールプロセス中に記録したMinGW-w64のインストール先フォルダをリストに追加します。上記でデフォルト設定を使用した場合は、パスは
C:\msys64\ucrt64\binになります。 - OKを選択し、次に環境変数ウィンドウで再度OKを選択して、
PATH環境変数を更新します。更新されたPATH環境変数を有効にするには、コンソールウィンドウをすべて開き直す必要があります。
MinGWのインストールを確認する
MinGW-w64ツールが正しくインストールされ、利用可能であることを確認するには、新しいコマンドプロンプトを開き、次のように入力します。
gcc --version
g++ --version
gdb --version
GCC、g++、GDBのインストールされているバージョンを示す出力が表示されるはずです。そうでない場合:
- PATH環境変数のエントリが、ツールチェーンがインストールされているMinGW-w64バイナリの場所と一致していることを確認してください。コンパイラがそのPATHエントリに存在しない場合は、前の手順に従ったことを確認してください。
gccの出力は正しいがgdbの出力が正しくない場合は、MinGW-w64ツールセットに不足しているパッケージをインストールする必要があります。- コンパイル時に「The value of miDebuggerPath is invalid.」というメッセージが表示される場合、原因の1つは
mingw-w64-gdbパッケージが不足している可能性があります。
- コンパイル時に「The value of miDebuggerPath is invalid.」というメッセージが表示される場合、原因の1つは
Hello Worldアプリを作成する
まず、プロジェクトを設定しましょう。
- Windowsコマンドプロンプトを起動します (Windows検索バーに「Windowsコマンドプロンプト」と入力します)。
- 次のコマンドを実行します。これらは、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にします。

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)) に、追加したファイルが表示されることに注目してください。

また、ファイル > 自動保存を選択することで、ファイルの変更を自動的に保存する自動保存を有効にすることもできます。VS Codeのユーザーインターフェースドキュメントで、他のビューについて詳しく知ることができます。
注: C++ファイルを保存または開くと、C/C++拡張機能からInsiders版の利用可能性に関する通知が表示される場合があります。これにより、新しい機能や修正をテストできます。この通知は
X(通知をクリア) を選択して無視できます。
IntelliSense を探索する
IntelliSense は、コード補完、パラメータ情報、クイック情報、メンバーリストなどのコード編集機能を追加することで、より速く、より効率的にコーディングするのに役立つツールです。
IntelliSenseの動作を確認するには、vectorまたはstringにカーソルを合わせると、その型情報が表示されます。10行目にmsg.と入力すると、推奨されるメンバー関数の補完リストが表示されます。これらはすべて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ツールチェーンのインストール」の手順を完了していることを確認してください。
-
helloworld.cppをアクティブ ファイルとして開きます。 -
エディターの右上隅にある再生ボタンを押します。

-
システム上で検出されたコンパイラの一覧から、C/C++: g++.exe のビルドとアクティブなファイルのデバッグを選択します。

helloworld.cpp を初めて実行するときにのみコンパイラを選択するように求められます。このコンパイラは、tasks.json ファイルで「デフォルト」コンパイラとして設定されます。
-
ビルドが成功すると、プログラムの出力は統合ターミナルに表示されます。

おめでとうございます!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スイッチ) を作成するように指示します (${fileBasenameNoExtension}.exe)。私たちの場合、これは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++ファイルをビルドするには、ファイルを明示的にリストするか、makeやcmakeのようなビルドシステムを使用するか、または次の回避策を実装する必要があります:https://www.msys2.org/docs/c/#expanding-wildcard-arguments。
以前、現在のフォルダ内のすべての.cppファイルをコンパイルするために"${workspaceFolder}/*.cpp"を使用していた場合、これは直接機能しなくなります。代わりに、ファイルを手動でリストするか、ビルドスクリプトを定義できます。
helloworld.cpp をデバッグする
コードをデバッグするには、
helloworld.cppに戻り、アクティブ ファイルにします。- エディターのマージンをクリックするか、現在の行で F9 を使用してブレークポイントを設定します。

- 再生ボタンの横にあるドロップダウンから、C/C++ ファイルをデバッグを選択します。

- システム上で検出されたコンパイラの一覧から「C/C++: g++ のビルドとアクティブなファイルのデバッグ」を選択します(
helloworld.cppを初めて実行またはデバッグするときにのみ、コンパイラを選択するよう求められます)。
再生ボタンには、「C/C++ ファイルを実行」と「C/C++ ファイルをデバッグ」の2つのモードがあります。最後に使用されたモードがデフォルトになります。再生ボタンにデバッグアイコンが表示されている場合、ドロップダウンを使用せずに再生ボタンを選択するだけでデバッグできます。
デバッガーを探索する
コードのステップ実行を開始する前に、ユーザーインターフェイスのいくつかの変更点に注目してみましょう。
-
統合ターミナルがソースコードエディターの下部に表示されます。デバッグコンソールタブには、デバッガが起動して実行中であることを示す出力が表示されます。
-
エディターは、デバッガーを開始する前にブレークポイントを設定した行を強調表示します。

-
左側の実行とデバッグビューにはデバッグ情報が表示されます。このチュートリアルで後ほど例を示します。
-
コード エディターの上部にデバッグ コントロール パネルが表示されます。左側のドットを掴んで画面上を移動させることができます。

コードをステップ実行する
これで、コードのステップ実行を開始する準備ができました。
-
デバッグコントロールパネルでステップオーバーアイコンを選択します。

これにより、プログラムの実行がforループの最初の行に進み、
msg変数が作成され初期化されるときに呼び出されるvectorおよびstringクラス内のすべての内部関数呼び出しがスキップされます。左側の変数ウィンドウの変更に注目してください。
この場合、ループの変数名がデバッガに表示されていても、ステートメントがまだ実行されていないため、現時点では読み取るものがないため、エラーは予期されます。ただし、
msgの内容は、そのステートメントが完了しているため表示されます。 -
ステップ オーバーをもう一度押して、このプログラムの次のステートメントに進みます (ループを初期化するために実行されるすべての内部コードをスキップします)。これで、変数ウィンドウにはループ変数に関する情報が表示されます。
-
ステップオーバーをもう一度押して、
coutステートメントを実行します。(C++拡張機能は、ループが終了するまでデバッグコンソールに何も出力しないことに注意してください。) -
必要であれば、ベクター内のすべての単語がコンソールに印刷されるまでステップオーバーを押し続けることができます。しかし、興味がある場合は、ステップインボタンを押してC++標準ライブラリのソースコードをステップスルーしてみてください!
自分のコードに戻るには、1つの方法はステップオーバーを押し続けることです。もう1つの方法は、コードエディターで
helloworld.cppタブに切り替え、ループ内のcoutステートメントのどこかに挿入点を置いて、F9を押して、自分のコードにブレークポイントを設定することです。左側のガターに赤い点が表示され、この行にブレークポイントが設定されていることを示します。
次に、F5を押して、標準ライブラリヘッダーの現在の行から実行を開始します。実行は
coutで中断されます。必要であれば、もう一度F9を押してブレークポイントをオフにすることもできます。ループが完了すると、統合ターミナルにGDBが出力する他の診断情報と共に、出力が表示されます。

ウォッチを設定する
プログラムの実行中に変数の値を追跡したい場合があります。これは、変数にウォッチを設定することで行うことができます。
-
カーソルをループ内に配置します。ウォッチウィンドウでプラス記号を選択し、テキストボックスにループ変数の名前である
wordと入力します。これで、ループをステップ実行しながらウォッチウィンドウを表示します。
-
ループの前に
int i = 0;というステートメントを追加して、別のウォッチを追加します。次に、ループ内に++i;というステートメントを追加します。前のステップで行ったように、iのウォッチを追加します。 -
ブレークポイントで実行が一時停止している間に任意の変数の値をすばやく表示するには、マウス ポインターをその変数に重ねます。

launch.json を使用してデバッグをカスタマイズする
再生ボタンまたはF5でデバッグする場合、C++拡張機能は動的なデバッグ構成をその場で作成します。
実行時にプログラムに渡す引数を指定するなど、デバッグ構成をカスタマイズしたい場合があります。カスタム デバッグ構成はlaunch.jsonファイルで定義できます。
launch.json を作成するには、再生ボタンのドロップダウン メニューからデバッグ構成の追加を選択します。

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

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を表示できます。

これにより、C/C++ 構成ページが開きます。ここで変更を加えると、VS Code はそれらを.vscodeフォルダー内のc_cpp_properties.jsonというファイルに書き込みます。
ここでは、構成名をGCCに変更し、コンパイラパスのドロップダウンをg++コンパイラに、IntelliSenseモードをコンパイラに合わせて (gcc-x64) 設定しました。

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が見つかりません
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++ 拡張機能の概要を確認してください。
- 新しいワークスペースを作成し、
.vscodeJSONファイルをそこにコピーし、新しいワークスペースパス、プログラム名などに必要な設定を調整して、コーディングを開始しましょう!