MinGW を使用した GCC
このチュートリアルでは、Windows 上で実行されるプログラムを作成するために、Visual Studio Code を構成して GCC C++ コンパイラ (g++) と mingw-w64 の GDB デバッガーを使用する方法を説明します。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 ツールチェーンのインストール
MSYS2 を介して最新バージョンの MinGW-w64 を取得します。MSYS2 は、GCC、MinGW-w64、およびその他の役立つ C++ ツールとライブラリの最新のネイティブビルドを提供します。これにより、コードのコンパイル、デバッグ、および IntelliSense と連携するように構成するために必要なツールが提供されます。
MinGW-w64 ツールチェーンをインストールするには、このビデオを確認するか、以下の手順に従ってください。
-
MSYS2 ページから最新のインストーラーをダウンロードするか、この インストーラーへの直接リンク を使用できます。
-
インストーラーを実行し、インストールウィザードの手順に従います。MSYS2 には 64 ビット Windows 8.1 以降が必要であることに注意してください。
-
ウィザードで、目的のインストールフォルダーを選択します。後で使用するためにこのディレクトリを記録しておいてください。ほとんどの場合、推奨されるディレクトリで問題ありません。スタートメニューのショートカットの設定に進む場合も同様です。完了したら、[MSYS2 を今すぐ実行する] ボックスがオンになっていることを確認し、[完了] を選択します。これにより、MSYS2 ターミナルウィンドウが開きます。
-
このターミナルで、次のコマンドを実行して MinGW-w64 ツールチェーンをインストールします。
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
-
toolchain
グループのデフォルトのパッケージ数を Enter を押して受け入れます。 -
インストールを続行するかどうかを尋ねられたら、
Y
を入力します。 -
次の手順に従って、MinGW-w64
bin
フォルダーのパスを WindowsPATH
環境変数に追加します。- 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 の値が無効です。" というメッセージが表示される場合は、
mingw-w64-gdb
パッケージが不足していることが原因である可能性があります。
- コンパイル時に "miDebuggerPath の値が無効です。" というメッセージが表示される場合は、
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)) を開き、IntelliSense 構成の選択 と入力します。コンパイラのドロップダウンから、[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}
) を取得し、コンパイルして、アクティブなファイルと同じ名前で拡張子 .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++ ファイルをビルドするには、ファイルを明示的にリストするか、make
や cmake
などのビルドシステムを使用するか、次の回避策を実装する必要があります: https://www.msys2.org/docs/c/#expanding-wildcard-arguments。
以前に "${workspaceFolder}/*.cpp"
を使用して現在のフォルダー内のすべての .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++ 標準ライブラリのソースコードをステップ実行してみてください!
自分のコードに戻るには、[ステップオーバー] を押し続ける方法があります。別の方法は、コードエディターで
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
に設定されています。
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 を表示できます。
これにより、[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 構成の選択...] コマンドを使用して、拡張機能が検出したコンパイラの 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 ファイルをコピーして、新しいワークスペースパス、プログラム名などの必要な設定を調整して、コーディングを開始してください!