MSYS2(Windows) で C++

最近 Windows11 で MSYS2をインストールしたので、その時の備忘録。

インストール

MSYS2 のページからインストーラーをダウンロード。
私が使用したのは msys2-x86_64-20251213.exe
ディフォルトでは C:\msys64 にインストールされる。
MSYS2で64bitのC++を使うには、MINGW64かUCRT64 をインストールする。
UCRT64は新しいC++規格(C++11以降)の開発向きということなので、 こちらをインストールする。

インストールが終ったら、メニューから MSYS2 UCRT64 を起動。

以下の二行を入力
pacman -Syu
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
途中で引っ掛かる場合は再度入力して最後まで実行する。
g++ --version と打ち込んで、インストールされたことを確認。
ディスク上のサイズは 1.52G であった。

コンパイルのテスト

コマンドプロンプトからコンパイルするために、次のようなバッチファイルを用意した。
PATH=C:\msys64\ucrt64\bin;C:\msys64\usr\bin;%path%
set MSYSTEM=UCRT64
chcp 65001
rem bash の起動はお好みで

C++ 入門のページからサンプルをダウンロード。

main.cpp

#include 
using namespace std;
int main(){
    cout << "HelloWorld." << endl;
    return 0;
}

g++ main.cpp
コンパイラを起動するがエラーとなる。 調べてみると、libwinpthread-1.dll の呼出でエラーとなっている。
c:\windows\system32 にある dll が旧い(2018年)のが原因 msys64\ucrt64\bin にあるdll(2025年)をc:\windows\system32 に上書きコピーして解決.
g++ main.cpp と入力して a.exe が作成されたことを確認。

しかし a.exe を起動しても何も表示されずに終わる。 そこで、デバッグオプション付でコンパイル
g++ -O0 -g main.cpp
デバッガーから起動
gdb a.exe
デバッガー上で run コマンドで走らせる。
(gdb) run

最後に以下のメッセージが出て、エラーが発生していることが判る。 (デバッガーは quit コマンドで終了)

Thread 1 received signal SIGSEGV, Segmentation fault.
0x000000006fcaac42 in libstdc++-6!_ZNSo6sentryC1ERSo () from C:\WINDOWS\SYSTEM32

そこで、 msys64\ucrt64\bin\libstdc++-6.dll をc:\windows\system32 に上書きコピーして解決.
今度は a.exe を実行してもエラーにならず、 "HelloWorld."と表示される。

余談

最後のエラーを避ける方法であるが、静的結合(-static オプション)で dll を使わない実行フィアルを作成するという方法もあるようだ。
実行ファイルは大きくなるが、配布する際のトラブルを避けられメリットがある。

インストールには @koyukitukimino(つきみの こゆき)さんのページを参考にした。

2026年1月8日

  戻る