GCCとMinGWの使用
このチュートリアルでは、Visual Studio CodeでGCC C++コンパイラ (g++) とGDBデバッガーをmingw-w64から使用して、Windows上で動作するプログラムを作成する設定を行います。VS Codeの設定後、Hello Worldプログラムをコンパイル、実行、デバッグします。
このチュートリアルでは、GCC、GDB、MinGW-w64、またはC++言語については解説しません。これらのテーマについては、ウェブ上に多くの優れたリソースがあります。
何か問題がある場合は、VS Codeドキュメントリポジトリにこのチュートリアルのissueを自由に提出してください。
前提条件
このチュートリアルを正常に完了するには、以下の手順を実行する必要があります
-
Visual Studio Code をインストールします。
-
VS Code用C/C++拡張機能をインストールします。拡張機能ビュー (⇧⌘X (Windows、Linux Ctrl+Shift+X)) で「C++」を検索して、C/C++拡張機能をインストールできます。
MinGW-w64ツールチェーンのインストール
MSYS2を介してMinGW-w64の最新バージョンを入手します。MSYS2は、GCC、MinGW-w64、およびその他の役立つC++ツールとライブラリの最新のネイティブビルドを提供します。これにより、コードのコンパイル、デバッグ、および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の検索バーに「Settings」と入力して、Windowsの設定を開きます。
- 「Edit environment variables for your account」を検索します。
- 「User variables」で、
Path
変数を選択し、Editを選択します。 - Newを選択し、インストールプロセス中に記録したMinGW-w64のインストール先フォルダをリストに追加します。上記でデフォルト設定を使用した場合は、パスは
C:\msys64\ucrt64\bin
になります。 - OKを選択し、その後、Environment Variablesウィンドウで再度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.」というメッセージが表示される場合、原因の一つとして
mingw-w64-gdb
パッケージが不足している可能性があります。
- コンパイル時に「The value of miDebuggerPath is invalid.」というメッセージが表示される場合、原因の一つとして
Hello Worldアプリの作成
まず、プロジェクトを設定しましょう。
- Windowsコマンドプロンプトを起動します(Windowsの検索バーに「Windows command prompt」と入力します)。
- 以下のコマンドを実行します。これらは、すべての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構成の選択と入力します。コンパイラのドロップダウンから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
スイッチ)を作成するよう指示します。我々の場合、これは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++標準ライブラリのソースコードをステップ実行してみてください!
自分のコードに戻るには、ステップオーバーを押し続ける方法が一つです。もう一つの方法は、コードエディターで
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が見つからない
完全なMinGW-w64ツールチェーン(pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
)とすべての必須前提条件をインストールするには、MSYS2ウェブサイトの手順に従ってMSYS CLIを使用する必要があります。このツールチェーンには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ファイルをそこにコピーし、新しいワークスペースのパス、プログラム名などに必要な設定を調整して、コーディングを開始しましょう!