MSYS2とVisual Studio Code(VS Code)を組み合わせると、Windows上でBashやpacmanを利用しながら、GCC・G++・GDB・Make・CMakeなどを使った開発環境を構築できます。
特に、Windows向けのC/C++アプリケーションをGNU系ツールチェーンで開発したい場合に便利です。
基本的な構成は、Windows版のVS Codeをエディターとして利用し、MSYS2側からコンパイラーやデバッガー、Unix系コマンドを提供する形になります。
Windows
├─ Visual Studio Code
│ ├─ エディター
│ ├─ C/C++拡張機能
│ └─ 統合ターミナル
│
└─ MSYS2
├─ Bash
├─ pacman
└─ UCRT64
├─ GCC
├─ G++
├─ GDB
├─ Make
└─ CMakeなど
MSYS2には複数の実行環境がありますが、新しくWindows向けC/C++開発環境を構築する場合は、基本的にUCRT64を選ぶと分かりやすいでしょう。
MSYS2とは
MSYS2は、Windows上でUnix/Linuxに近いシェル環境や開発ツールを利用できるソフトウェア環境です。
Bashをはじめ、grep、sed、awk、tarなどのUnix系コマンドを利用できるほか、パッケージマネージャーのpacmanを使って開発ツールを簡単に追加できます。
GCCやGDBを簡単にインストールできる
MSYS2では、C/C++開発でよく利用される以下のツールをインストールできます。
gcc
g++
gdb
make
cmake
ninja
git
Windows向けのC/C++開発では、MSYS2そのものに含まれるMSYS環境ではなく、UCRT64などのMinGW-w64系環境を利用するのが基本です。
VS Code自体にコンパイラーは含まれていない
VS Codeはコード編集やデバッグ機能を提供するエディターですが、GCCやG++などのコンパイラーそのものは含まれていません。
MicrosoftのC/C++拡張機能についても同様で、コード補完やデバッグ連携などを提供しますが、実際にプログラムをコンパイルするためのGCCやG++は別途用意する必要があります。
その役割をMSYS2に担当させることで、Windows上でもGNU系のC/C++開発環境を構築できます。
MSYS2をインストールする
まず、WindowsにMSYS2をインストールします。
標準的なインストール先は以下です。
C:\msys64
特別な理由がなければ、デフォルトのインストール先を利用した方が後の設定が簡単です。
MSYS2を最新版に更新する
MSYS2をインストールしたら、ターミナルを開いて次のコマンドを実行します。
pacman -Syu
更新内容によっては、途中でMSYS2のターミナルを終了するよう案内される場合があります。
その場合は一度ターミナルを閉じて再度起動し、もう一度以下を実行します。
pacman -Syu
システムを最新状態にしてから開発環境を構築することで、古いパッケージによるトラブルを避けやすくなります。
MSYS2には複数の環境がある
MSYS2を使ううえで重要なのが、複数の実行環境が存在する点です。
代表的な環境には以下があります。
MSYS
UCRT64
CLANG64
CLANGARM64
過去によく利用されていたMINGW64やMINGW32もありますが、現在新規に環境を構築する場合は、UCRT64を基本に考えるとよいでしょう。
MSYS環境
MSYS環境は、主にUnix系コマンドやシェルスクリプトをWindows上で利用するための環境です。
例えば以下のようなコマンドを利用できます。
bash
grep
sed
awk
tar
ssh
ただし、一般的なWindows向けC/C++アプリケーションを開発する場合は、MSYS環境ではなくUCRT64などを利用します。
UCRT64環境
UCRT64は、GCCとWindowsのUniversal C Runtimeを組み合わせたWindows向け開発環境です。
新しくMSYS2を利用してWindows向けC/C++開発を始めるのであれば、UCRT64が分かりやすい選択肢です。
UCRT64環境では、主に以下のディレクトリにツールが配置されます。
C:\msys64\ucrt64\bin
MSYS2内では以下のように見えます。
/ucrt64/bin
UCRT64のGCC・G++・GDBをインストールする
C/C++開発を行う場合は、UCRT64向けのツールチェーンをインストールします。
MSYS2のターミナルで以下を実行します。
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
途中でインストールするパッケージの選択を求められた場合は、基本的にはそのまま一式をインストールして問題ありません。
インストールできたか確認する
インストール後は以下を実行します。
gcc --version
g++ --version
gdb --version
それぞれバージョン情報が表示されれば、ツールチェーンを利用できます。
参考サイト
Windows 11にC言語の開発環境を構築する【MSYS2+VSCode】
VS Codeをインストールする
VS Codeは、MSYS2の中にインストールするのではなく、通常のWindowsアプリケーションとしてインストールします。
構成としては以下のようになります。
Windows版VS Code
↓
MSYS2 UCRT64
↓
GCC・G++・GDB
つまり、VS Codeは編集やデバッグの画面を提供し、実際のコンパイルなどはMSYS2のツールチェーンで行います。
VS CodeにC/C++拡張機能をインストールする
C/C++を開発する場合は、Microsoftが提供している「C/C++」拡張機能をインストールしておくと便利です。
VS Codeで以下のショートカットを押します。
Ctrl + Shift + X
拡張機能画面が開いたら、以下を検索します。
C/C++
Microsoftが提供しているC/C++拡張機能をインストールします。
C/C++拡張機能でできること
主に以下の機能を利用できます。
- IntelliSenseによるコード補完
- 構文エラーの確認
- ヘッダーファイルの解析
- GCCやG++を使ったビルド
- GDBを使ったデバッグ
- ブレークポイントの設定
- 変数やコールスタックの確認
ただし、前述したとおりGCCやGDBそのものは別途MSYS2側へインストールする必要があります。
VS Codeの統合ターミナルでMSYS2 UCRT64を使う
VS CodeとMSYS2を組み合わせる場合、統合ターミナルからUCRT64環境を起動できるようにすると便利です。
ここで注意したいのが、単純に以下のBashを起動するだけでは、必ずしもUCRT64環境になるとは限らないことです。
C:\msys64\usr\bin\bash.exe
UCRT64を確実に利用したい場合は、MSYS2のmsys2_shell.cmdに-ucrt64を指定する方法が分かりやすいでしょう。
settings.jsonを開く
VS Codeで以下を押します。
Ctrl + Shift + P
コマンドパレットから以下を選択します。
Preferences: Open User Settings (JSON)
そして、次のようなターミナルプロファイルを登録します。
{
"terminal.integrated.profiles.windows": {
"MSYS2 UCRT64": {
"path": "cmd.exe",
"args": [
"/c",
"C:\\msys64\\msys2_shell.cmd -defterm -here -no-start -ucrt64"
]
}
}
}
これにより、VS CodeからUCRT64環境を明示的に起動できます。
MSYS2 UCRT64をデフォルトターミナルにする
毎回ターミナルを選択するのが面倒であれば、デフォルトに設定できます。
{
"terminal.integrated.profiles.windows": {
"MSYS2 UCRT64": {
"path": "cmd.exe",
"args": [
"/c",
"C:\\msys64\\msys2_shell.cmd -defterm -here -no-start -ucrt64"
]
}
},
"terminal.integrated.defaultProfile.windows": "MSYS2 UCRT64"
}
この状態でVS Codeから新しいターミナルを開くと、MSYS2 UCRT64が起動します。
統合ターミナルは以下のショートカットから開けます。
Ctrl + `
Bashを直接登録する方法もある
VS Codeでは、MSYS2のBashを直接ターミナルプロファイルとして登録することもできます。
例えば以下のように設定できます。
{
"terminal.integrated.profiles.windows": {
"bash (MSYS2)": {
"path": "C:\\msys64\\usr\\bin\\bash.exe",
"args": [
"--login",
"-i"
],
"env": {
"CHERE_INVOKING": "1"
}
}
}
}
CHERE_INVOKINGとは
CHERE_INVOKINGを設定すると、ログインシェルを起動した際にホームディレクトリへ自動的に移動する動作を抑え、現在の作業ディレクトリを維持しやすくなります。
ただし、この方法はあくまでも「MSYS2 Bashを起動する設定」です。
UCRT64を確実に利用したいのであれば、先ほどのmsys2_shell.cmd -ucrt64を利用する方法の方が分かりやすいでしょう。
UCRT64環境になっているか確認する
MSYS2のターミナルを開いたら、以下を実行します。
echo $MSYSTEM
UCRT64環境であれば、以下のように表示されます。
UCRT64
さらに、使用しているGCCを確認します。
which gcc
which g++
which gdb
UCRT64のツールチェーンを正しく利用していれば、例えば以下のようになります。
/ucrt64/bin/gcc
/ucrt64/bin/g++
/ucrt64/bin/gdb
もし以下のようになっている場合は、別の環境を使用している可能性があります。
/usr/bin/gcc
Windows向けUCRT64ツールチェーンを利用したい場合は、/ucrt64/bin側のコンパイラーを使っているか確認しましょう。
WindowsのPATHにUCRT64を追加する
MSYS2のUCRT64ターミナル内だけでGCCを使うのであれば、Windows側のPATH設定が必ず必要になるわけではありません。
一方で、PowerShellやコマンドプロンプト、VS CodeのタスクなどからGCCを直接実行したい場合は、Windowsの環境変数Pathへ次のディレクトリを追加すると便利です。
C:\msys64\ucrt64\bin
PATHへ追加する手順
Windowsで「環境変数」と検索し、環境変数の編集画面を開きます。
ユーザー環境変数またはシステム環境変数のPathを編集し、以下を追加します。
C:\msys64\ucrt64\bin
設定を変更した後は、VS Codeを一度完全に終了してから起動し直します。
WindowsからGCCを確認する
コマンドプロンプトやPowerShellで以下を実行します。
gcc --version
g++ --version
gdb --version
さらに、どの実行ファイルが使われているか確認する場合は次のようにします。
where gcc
where g++
where gdb
例えば以下が表示されれば、MSYS2 UCRT64版が使われています。
C:\msys64\ucrt64\bin\gcc.exe
C:\msys64\ucrt64\bin\g++.exe
C:\msys64\ucrt64\bin\gdb.exe
VS CodeでC++プログラムをコンパイルする
実際に簡単なプログラムを作成して確認してみましょう。
例えばhello.cppを作成します。
#include <iostream>
int main()
{
std::cout << "Hello, MSYS2!" << std::endl;
return 0;
}
MSYS2 UCRT64ターミナルで以下を実行します。
g++ hello.cpp -o hello.exe
コンパイルに成功すると、以下が作成されます。
hello.exe
実行します。
./hello.exe
以下のように表示されれば成功です。
Hello, MSYS2!
VS Codeのtasks.jsonでビルドする
毎回ターミナルへg++コマンドを入力するのが面倒な場合は、VS Codeのタスク機能を利用できます。
プロジェクト内に以下のファイルを作成します。
.vscode/tasks.json
例えば次のように設定します。
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: MSYS2 UCRT64 g++ build",
"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
}
}
]
}
重要なのは以下です。
"command": "C:\\msys64\\ucrt64\\bin\\g++.exe"
G++の絶対パスを指定することで、PC内に複数のGCCが存在していても、MSYS2 UCRT64のG++を確実に利用できます。
複数ファイルのプロジェクトではビルドシステムを使う
単一ファイルであればtasks.jsonから直接コンパイルしても問題ありません。
しかし、複数の.cppファイルを扱うプロジェクトでは、MakeやCMakeなどのビルドシステムを利用する方が管理しやすくなります。
単純に以下のようなワイルドカード指定だけに依存すると、シェルやツールチェーンの動作によって期待どおり展開されない場合があります。
*.cpp
中規模以上のプロジェクトでは、以下のようなビルドツールを検討するとよいでしょう。
Make
CMake
Ninja
Meson
GDBでデバッグする
MSYS2 UCRT64ではGDBも利用できます。
まず以下で確認します。
gdb --version
VS CodeからGDBを利用する場合は、.vscode/launch.jsonへデバッガーの場所を指定できます。
例えば次のようにします。
"miDebuggerPath": "C:\\msys64\\ucrt64\\bin\\gdb.exe"
GDBを使うとできること
VS CodeとGDBを組み合わせると、以下のようなデバッグができます。
- ブレークポイント
- ステップ実行
- Step Into
- Step Over
- Step Out
- ローカル変数の確認
- ウォッチ式
- コールスタックの確認
コンパイル時には、デバッグ情報を含めるために-gオプションを付けておくとよいでしょう。
g++ -g main.cpp -o main.exe
IntelliSenseにMSYS2のG++を認識させる
プログラム自体は正常にコンパイルできるのに、VS Code上でヘッダー関連のエラーが表示される場合があります。
例えば以下のようなケースです。
#include errors detected
これは、実際に使っているコンパイラーとVS CodeのIntelliSense設定が一致していないことが原因の場合があります。
compilerPathを指定する
.vscode/c_cpp_properties.jsonで以下のように設定できます。
{
"configurations": [
{
"name": "Win32",
"compilerPath": "C:/msys64/ucrt64/bin/g++.exe",
"cppStandard": "c++17",
"intelliSenseMode": "windows-gcc-x64"
}
],
"version": 4
}
特に重要なのは以下です。
"compilerPath": "C:/msys64/ucrt64/bin/g++.exe"
これによって、C/C++拡張機能が使用するコンパイラーを判断しやすくなります。
コマンドパレットから選択する方法もある
必ずしもc_cpp_properties.jsonを手作業で編集する必要はありません。
コマンドパレットを開き、以下を実行する方法もあります。
C/C++: Select IntelliSense Configuration
検出されたコンパイラーの中から、MSYS2 UCRT64のG++を選択します。
MakeをVS Codeから使う
MSYS2ではMakeも利用できます。
例えば以下のMakefileがあるとします。
CXX = g++
main: main.cpp
$(CXX) main.cpp -o main.exe
MSYS2 UCRT64のターミナルから以下を実行します。
make
ビルド後は以下で実行できます。
./main.exe
複数ファイルを扱う場合は、tasks.jsonへコンパイル対象を大量に記述するより、Makefileで管理した方が分かりやすい場合があります。
CMakeをVS Codeから使う
より規模の大きいC/C++プロジェクトでは、CMakeを利用する方法もあります。
MSYS2ではUCRT64向けのCMake関連パッケージを利用できます。
インストール後は以下で確認できます。
cmake --version
一般的なプロジェクトでは次のようにビルドします。
cmake -S . -B build
cmake --build build
VS CodeにはCMake Tools拡張機能もあるため、CMakeプロジェクトをGUIから構成・ビルド・デバッグすることもできます。
MSYS2からVS Codeを起動する
codeコマンドがPATHから利用できる環境であれば、MSYS2のターミナルからVS Codeを起動できます。
例えばプロジェクトへ移動します。
cd /c/Users/username/projects/sample
そして以下を実行します。
code .
.は現在のディレクトリを意味します。
そのため、現在いるフォルダーをVS Codeで開けます。
WindowsとMSYS2ではパスの書き方が異なる
MSYS2を使うときは、WindowsとUnix形式のパス表記の違いに注意が必要です。
Windowsでは以下のように書きます。
C:\Users\username\project
MSYS2では以下のように表せます。
/c/Users/username/project
例えばMSYS2から移動する場合は次のようにします。
cd /c/Users/username/project
JSONではバックスラッシュをエスケープする
VS Codeの設定ファイルではWindows形式のパスを指定することがあります。
JSONでは\をそのまま書けないため、次のように二重にします。
"C:\\msys64\\ucrt64\\bin\\g++.exe"
あるいは、設定によってはスラッシュを使って以下のように記述できる場合もあります。
C:/msys64/ucrt64/bin/g++.exe
MSYS2とMinGW-w64は同じものではない
MSYS2とMinGW-w64は混同されやすいですが、同じものではありません。
MSYS2は、パッケージ管理やシェル環境を含めた開発環境全体を提供します。
その中で、Windowsネイティブ向けのプログラムを作るためにMinGW-w64系のツールチェーンを利用します。
関係を簡略化すると以下のようになります。
MSYS2
├─ pacman
├─ Bash
├─ Unix系ツール
└─ UCRT64
└─ MinGW-w64系ツールチェーン
├─ GCC
├─ G++
└─ GDB
そのため、以下のように完全に同一視するのは正確ではありません。
MSYS2 = GCC
MSYS2 = MinGW-w64
古いVS Codeのターミナル設定には注意する
古い解説記事では、以下のような設定を見かける場合があります。
"terminal.integrated.shell.windows": "C:\\msys64\\usr\\bin\\bash.exe"
現在のVS Codeでは、この方式ではなくターミナルプロファイルを利用します。
基本的には以下を利用します。
terminal.integrated.profiles.windows
terminal.integrated.defaultProfile.windows
そのため、古い記事を参考にする際は設定項目の違いに注意しましょう。
GCCが見つからない場合の対処法
MSYS2ではgccが使えるのにVS CodeやPowerShellでは使えない場合、PATH設定を確認します。
Windows側から直接GCCを利用したい場合は、以下がPathへ追加されているか確認します。
C:\msys64\ucrt64\bin
また、環境変数を変更した後は、既に起動しているVS Codeには変更が反映されない場合があります。
一度VS Codeを完全に終了してから起動し直してください。
複数のGCCがインストールされている場合
Windowsでは、MSYS2以外にもChocolatey、Scoop、MinGW、CygwinなどからGCCをインストールしている場合があります。
複数のGCCが存在すると、意図しないコンパイラーが実行される可能性があります。
Windowsでは以下を実行します。
where gcc
where g++
where gdb
MSYS2では以下を実行します。
which gcc
which g++
which gdb
UCRT64を利用したいのであれば、以下のような場所が使われているか確認しましょう。
C:\msys64\ucrt64\bin\gcc.exe
C:\msys64\ucrt64\bin\g++.exe
C:\msys64\ucrt64\bin\gdb.exe
MSYS2内では以下です。
/ucrt64/bin/gcc
/ucrt64/bin/g++
/ucrt64/bin/gdb
MSYS2とWSLの違い
MSYS2とWSLは、どちらもWindows上でLinuxやUnix系の開発体験を得られるため混同されやすいですが、仕組みは異なります。
MSYS2が向いているケース
MSYS2は、Windowsネイティブの.exeをGCCやClangで作りたい場合に向いています。
例えば以下のような用途です。
Windows向けC/C++アプリ開発
MinGW-w64によるビルド
BashやUnix系コマンドの利用
pacmanによる開発ツール管理
WSLが向いているケース
WSLは、Windows上でLinux環境を利用したい場合に向いています。
例えば以下の用途です。
Linux向けアプリケーション開発
Linuxサーバー環境の再現
Linux版GCCやClangの利用
Linux固有ツールの利用
最終的に作りたいプログラムがWindows向けなのかLinux向けなのかによって選ぶと分かりやすいでしょう。
MSYS2とVS Codeのおすすめ構成
新しくMSYS2とVS Codeを使ってC/C++開発を始めるのであれば、次の構成が分かりやすいでしょう。
Visual Studio Code
│
├─ Microsoft C/C++ extension
│
└─ MSYS2
└─ UCRT64
├─ gcc.exe
├─ g++.exe
├─ gdb.exe
├─ make
└─ cmake
まずUCRT64ツールチェーンをインストールします。
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
VS Codeの統合ターミナルにはUCRT64を登録します。
{
"terminal.integrated.profiles.windows": {
"MSYS2 UCRT64": {
"path": "cmd.exe",
"args": [
"/c",
"C:\\msys64\\msys2_shell.cmd -defterm -here -no-start -ucrt64"
]
}
},
"terminal.integrated.defaultProfile.windows": "MSYS2 UCRT64"
}
さらに、Windows側のPowerShellやVS CodeタスクからGCCを直接利用したい場合は、以下をWindowsのPATHへ追加します。
C:\msys64\ucrt64\bin
VS Codeのビルド設定では、必要に応じて以下を明示します。
C:\msys64\ucrt64\bin\g++.exe
デバッグでは以下を指定します。
C:\msys64\ucrt64\bin\gdb.exe
この構成にしておくと、MSYS2のUCRT64環境とVS CodeのC/C++機能を組み合わせた、比較的分かりやすいWindows向け開発環境を構築できます。
まとめ
MSYS2でVS Codeを使う場合は、VS CodeをWindows側のエディターとして利用し、MSYS2からコンパイラーやデバッガー、Unix系ツールを提供する構成が基本です。
特にWindows向けC/C++開発では、現在はUCRT64を中心に環境を構築すると分かりやすくなります。
MSYS2では以下のコマンドでUCRT64向けツールチェーンを導入できます。
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
VS Codeの統合ターミナルでUCRT64を使う場合は、単純にbash.exeを起動するだけではなく、次のようにUCRT64環境を明示的に起動する設定が分かりやすいでしょう。
C:\msys64\msys2_shell.cmd -defterm -here -no-start -ucrt64
また、Windows側からGCCやG++を直接利用したい場合は、以下をPATHへ追加します。
C:\msys64\ucrt64\bin
MSYS2ではMSYS・UCRT64・CLANG64など複数の環境が存在するため、異なる環境のコンパイラーやライブラリを混在させないことも重要です。
VS Code側でもG++やGDBのパスをUCRT64に統一しておけば、コンパイラーの競合やIntelliSenseの認識違いといったトラブルを減らしながら、Windows上で快適なC/C++開発環境を構築できます。
以上、MSYS2でVS Codeを使う方法についてでした。
最後までお読みいただき、ありがとうございました。









