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 をお気軽に提出してください。
前提条件
このチュートリアルを正常に完了するには、以下の手順を実行する必要があります
-
Visual Studio Code をインストールします。
-
VS Code の C/C++ 拡張機能をインストールします。C/C++ 拡張機能は、拡張機能ビュー (⇧⌘X (Windows、Linux では Ctrl+Shift+X)) で 'C++' を検索することでインストールできます。
MinGW-w64 ツールチェーンのインストール
最新版の MinGW-w64 を MSYS2 経由で入手します。MSYS2 は、GCC、MinGW-w64、その他の役立つ C++ ツールやライブラリの最新のネイティブビルドを提供します。これにより、コードのコンパイル、デバッグ、および IntelliSense と連携するための設定に必要なツールが提供されます。
MinGW-w64 ツールチェーンをインストールするには、このビデオをチェックするか、以下の手順に従ってください。
-
最新のインストーラーは、MSYS2 のページからダウンロードするか、こちらのインストーラーへの直接リンクを使用できます。
-
インストーラーを実行し、インストールウィザードの手順に従います。MSYS2 には 64 ビットの Windows 8.1 以降が必要であることに注意してください。
-
ウィザードで、希望のインストールフォルダーを選択します。後で使用するためにこのディレクトリを記録しておきます。ほとんどの場合、推奨されるディレクトリで問題ありません。スタートメニューのショートカットを設定する手順でも同様です。完了したら、[Run MSYS2 now (MSYS2 を今すぐ実行)] ボックスがチェックされていることを確認し、[Finish (完了)] を選択します。これにより、MSYS2 のターミナルウィンドウが開きます。
-
このターミナルで、次のコマンドを実行して MinGW-w64 ツールチェーンをインストールします。
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
-
toolchain
グループのデフォルトのパッケージ数を受け入れるには、Enter を押します。 -
インストールを続行するかどうかを尋ねられたら、
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 ツールセットから不足しているパッケージをインストールする必要があります。- コンパイル時に「miDebuggerPath の値が無効です。」というメッセージが表示される場合、原因の 1 つとして
mingw-w64-gdb
パッケージが不足している可能性があります。
- コンパイル時に「miDebuggerPath の値が無効です。」というメッセージが表示される場合、原因の 1 つとして
Hello World アプリを作成する
まず、プロジェクトをセットアップしましょう。
- Windows コマンドプロンプトを起動します (Windows の検索バーに「Windows コマンドプロンプト」と入力)。
- 次のコマンドを実行します。これにより、すべての 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
にします。
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)) を開き、Select IntelliSense Configuration と入力します。コンパイラのドロップダウンから、Use gcc.exe
を選択して構成します。詳細については、IntelliSense 構成ドキュメントを参照してください。
helloworld.cpp を実行する
C++ 拡張機能は、プログラムをビルドするためにマシンにインストールされている C++ コンパイラを使用することを忘れないでください。VS Code で helloworld.cpp
を実行およびデバッグする前に、「MinGW-w64 ツールチェーンのインストール」の手順を完了していることを確認してください。
-
helloworld.cpp
をアクティブ ファイルとして開きます。 -
エディターの右上隅にある再生ボタンを押します。
-
システムで検出されたコンパイラの一覧から、C/C++: g++.exe build and debug active file を選択します。
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}
) を受け取り、それをコンパイルし、現在のアクティブなファイルと同じ名前で .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++ ファイルをビルドするには、ファイルを明示的にリストするか、make
や cmake
のようなビルドシステムを使用するか、次の回避策を実装する必要があります: https://www.msys2.org/docs/c/#expanding-wildcard-arguments.
以前に "${workspaceFolder}/*.cpp"
を使用して現在のフォルダー内のすべての .cpp
ファイルをコンパイルしていた場合、これは直接機能しなくなります。代わりに、ファイルを手動でリストするか、ビルドスクリプトを定義することができます。
helloworld.cpp をデバッグする
コードをデバッグするには、
helloworld.cpp
に戻り、アクティブ ファイルにします。- エディターのマージンをクリックするか、現在の行で F9 を使用してブレークポイントを設定します。
- 再生ボタンの横にあるドロップダウンから、C/C++ ファイルをデバッグを選択します。
- システムで検出されたコンパイラの一覧から、C/C++: g++ build and debug active file を選択します (
helloworld.cpp
を初めて実行またはデバッグするときにのみコンパイラの選択を求められます)。
再生ボタンには、Run C/C++ File と Debug C/C++ File の 2 つのモードがあります。デフォルトでは最後に使用されたモードになります。再生ボタンにデバッグアイコンが表示されている場合は、ドロップダウンを使用せずに、再生ボタンを選択するだけでデバッグできます。
デバッガーを探索する
コードのステップ実行を開始する前に、ユーザーインターフェイスのいくつかの変更点に注目してみましょう。
-
統合ターミナルがソースコードエディターの下部に表示されます。[デバッグ コンソール] タブには、デバッガーが起動して実行中であることを示す出力が表示されます。
-
エディターは、デバッガーを開始する前にブレークポイントを設定した行を強調表示します。
-
左側の実行とデバッグビューにはデバッグ情報が表示されます。このチュートリアルで後ほど例を示します。
-
コード エディターの上部にデバッグ コントロール パネルが表示されます。左側のドットを掴んで画面上を移動させることができます。
コードをステップ実行する
これで、コードのステップ実行を開始する準備ができました。
-
デバッグコントロールパネルのステップオーバーアイコンを選択します。
これにより、プログラムの実行が for ループの最初の行に進み、
msg
変数が作成および初期化されるときに呼び出されるvector
およびstring
クラス内のすべての内部関数呼び出しをスキップします。左側の変数ウィンドウの変化に注目してください。この場合、エラーは想定内です。なぜなら、ループの変数名はデバッガーから見えるようになっていますが、ステートメントはまだ実行されていないため、この時点では読み取るものが何もないからです。ただし、
msg
の内容は、そのステートメントが完了しているため表示されます。 -
ステップ オーバーをもう一度押して、このプログラムの次のステートメントに進みます (ループを初期化するために実行されるすべての内部コードをスキップします)。これで、変数ウィンドウにはループ変数に関する情報が表示されます。
-
もう一度ステップオーバーを押して、
cout
ステートメントを実行します。(C++ 拡張機能は、ループが終了するまでデバッグ コンソールに出力を表示しないことに注意してください。) -
必要に応じて、ベクター内のすべての単語がコンソールに出力されるまでステップオーバーを押し続けることができます。しかし、もし興味があれば、ステップインボタンを押して C++ 標準ライブラリのソースコードをステップスルーしてみてください!
自分のコードに戻るには、ステップオーバーを押し続ける方法があります。もう 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 build and debug active file を選択します。
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 を表示できます。
これにより、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++: 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 ファイルをコピーし、新しいワークスペースのパスやプログラム名などに合わせて必要な設定を調整して、コーディングを始めましょう!