ヴェズルフェルニルの研究ノート

座右の銘「ただ一人犀の角のように歩め」的な研究活動ノート

【Windows】MinGW-w64によるGCC開発環境の構築

Windows上でのC/C++プログラムの開発にはVisual C++(in Visual Studio)を使うのが一般的だが、これはあくまでWindows完全依存のネイティブ・プログラムを開発するための環境だ。

昔からWindows上にUnix互換環境を構築する試みが行われていて、その集大成的なプロジェクトとして1995年に登場したCygwinというものがある。小生は10年前まで組み込み開発が専門分野だったので、Windows上にCygwin導入してクロスGCCコンパイラをよく使っていたものだ。組み込み屋にとってのCygwinの利用価値はこの一点だけだったので、仮想マシン・ツールの普及、DockerやWSLの登場によって、いまではCygwinを使うことはなくなってしまった。

GCCを使ってWindows用プログラムを開発したい、あるいはUnix/LinuxプログラムをWindowsへ移植したいという要望は昔からあって、それに応える開発環境プロジェクトとしてMinGW-w64(32ビット版MinGWプロジェクトからフォークした64ビット対応版)というのがある。

www.mingw-w64.org

MinGWCygwinからフォークしたプロジェクトだが、Cygwinの成果も吸収して発展し、いまではUnix互換開発環境としてはMinGWの方がメジャーになっている。

開発ブラットホームとしてMacLinuxWindowsを併用するようになり、Linux用プログラムをWindowsへ移植しなければならないケースも出てくるので、Windows機にMinGW-w64を導入した。

ググると同様の記事は多くあるが、自分の備忘録として、MinGW-w64のインストールと環境構築方法を書いておく。

MSYS2のインストール

MinGWプロジェクトの成果物としてMSYS(MSYS2)というのがある。これはBashシェル環境とコマンド群をまとめたもので、MinGW-w64とは別のプロジェクトだが、MinGW-w64とMSYS2を一緒に使うことで、Unixライクな64ビット版Windows用プログラムの開発環境を構築できる。

MSYS2のサイトから、この2つを統合した環境のインストーラを入手することができる(本記事執筆時点での最新版インストーラmsys2-x86_64-20240113.exe)。

www.msys2.org

じつは、MinGW-w64 + MSYS2を導入するのは、むしろこのMSYS2のBashターミナル環境を利用することが優先目的だったりする(MacLinuxのターミナル環境に慣れていると、PowerShellコマンドプロンプトを使うのは苦痛なので。YouTube上でのプログラミング・開発系話題の動画内でWindows環境を利用している場面で、このMinGW-w64 + MSYS2が使われているのを多く観られる。Visual Studio Codeと同様に、いまはこれがWindows利用開発での定番環境となっているようだ)。

インストーラのガイド表示に従って操作すると、MSYS2のデフォルトのインストール先ディレクトリはC:\msys64になる。

また、下の6つのアプリ・アイコンがスタートメニュー内に作成される。

これらのアイコンによって起動する各環境では、その中で使用されるコンパイラ・ツールチェイン、ターゲット・アーキテクチャ、ランタイム・ライブラリの種類が以下のように異なっている。

アブリ・アイコン ツールチェイン格納場所 コンパイラ ターゲットアーキテクチャ ランタイムライブラリ
MSYS2 MSYS /usr gcc x86_64 (Intel 64ビット) cygwin
MSYS2 UCRT64 /ucrt64 gcc x86_64 (Intel 64ビット) ucrt
MSYS2 CLANG64 /clang64 llvm x86_64 (Intel 64ビット) ucrt
MSYS2 CLANGARM64 /clangarm64 llvm aarch64 (ARM 64ビット) ucrt
MSYS2 MINGW32 /mingw32 gcc i686 (Intel 32ビット) msvcrt
MSYS2 MINGW64 /mingw64 gcc x86_64 (Intel 64ビット) msvcrt

LinuxC/C++プログラムはほとんどGCCを使って作成されているので、Linuxプログラムの64ビット版Windowsへの移植に利用するのはMSYS2 MINGW64になる(GCCベースのIntel 64ビット版Windowsプログラムの開発・移植しかやらないなら、これ以外は利用することはないかもしれない)。

MinGW-w64の初期設定

環境変数の設定

MSYS2のインストールが終わったら、システム環境変数に"MSYSTEM"="MINGW64"という設定を作成しておく。

管理者権限でPowerShellを開いて、下のコマンドを実行することで、その設定操作が行える。

> [System.Environment]::SetEnvironmentVariable("MSYSTEM", "MINGW64", "Machine")

さらに、ユーザー環境変数Pathに以下のパスを追加する。

  • C:\msys64\mingw64\bin
  • C:\msys64\usr\local\bin
  • C:\msys64\usr\bin
  • C:\msys64\bin
  • C:\msys64\opt\bin

PowerShellを開いて、以下のコマンドを実行することで、その設定操作が行える。

> $oldpath = [System.Environment]::GetEnvironmentVariable("Path", "User"); $oldpath += ";C:\msys64\mingw64\bin"; [System.Environment]::SetEnvironmentVariable("Path", $oldpath, "User")
> $oldpath = [System.Environment]::GetEnvironmentVariable("Path", "User"); $oldpath += ";C:\msys64\usr\local\bin"; [System.Environment]::SetEnvironmentVariable("Path", $oldpath, "User")
> $oldpath = [System.Environment]::GetEnvironmentVariable("Path", "User"); $oldpath += ";C:\msys64\usr\bin"; [System.Environment]::SetEnvironmentVariable("Path", $oldpath, "User")
> $oldpath = [System.Environment]::GetEnvironmentVariable("Path", "User"); $oldpath += ";C:\msys64\bin"; [System.Environment]::SetEnvironmentVariable("Path", $oldpath, "User")
> $oldpath = [System.Environment]::GetEnvironmentVariable("Path", "User"); $oldpath += ";C:\msys64\opt\bin"; [System.Environment]::SetEnvironmentVariable("Path", $oldpath, "User")

これらの環境変数は、コマンドプロンプトPowerShellなどのMSYS2シェル以外のターミナル環境からMinGW-w64のコマンド群を参照可能にするための設定だ。

パッケージの更新

アプリMSYS2 MINGW64を起動して、開いたシェル画面から下のコマンドを実行する。

$ pacman -Syu

これによって、パッケージデータベース情報、pacmanコマンド、コアパッケージが更新される。

もう一度MSYS2 MINGW64を開いて、下のコマンドを実行する。

$ pacman -Su

これによって、既存の全パッケージが更新される。

ユーザー・ホームディレクトリの変更

MSYS2シェル内でのユーザー・ホームディレクト/home/USERNAMEはパスC:\msys64\home\USERNAMEに割り当てられている。

これはユーザーの好み次第だが、以下のファイルを編集することで、このパスをC:\Users\USERNAMEに変更することができる。

  • C:\msys64\etc\nsswitch.conf(MSYS2シェル内パス/etc/nsswitch.conf
-db_home: cygwin desc
+#db_home: cygwin desc
+db_home: windows

この変更を行った場合は、MSYS2シェルから下のようなコマンドを実行して、すべての設定スクリプトファイルをC:\msys64\home\USERNAMEからC:\Users\USERNAMEへコピーしておくべきだ。

$ cd
$ cp -p /c/msys64/home/USERNAME/.profile /c/msys64/home/USERNAME/.bash_profile /c/msys64/home/USERNAME/.bash_logout /c/msys64/home/USERNAME/.bashrc .

GCCのインストールと動作確認

GCCパッケージのインストール

MSYS2 MINGW64シェルから以下のコマンドを実行すれば、GCCコンパイラおよびその関連パッケージ群をインストールできる。

$ pacman -S base-devel
$ pacman -S mingw-w64-x86_64-toolchain

インストール後、以下の3つのコマンドを実行して、GCCコンパイラが利用できることを確認しておく。

$ gcc --version
$ g++ --version
$ cpp --version

GCCによるコンパイル確認

適当なエディタを使って、以下のようなソース・ファイルを作成する。

#include <stdio.h>
int main() {
    printf("Hello, world!\n");
    printf("sizeof(size_t) = %ld\n", sizeof(size_t));
    return 0;
}

MSYS2 MINGW64シェルを開き、下のコマンドを実行すれば、本ソースがコンパイルされる。

$ gcc hello.c

続いて、下のコマンドを実行すれば、コンパイル生成されたプログラムを実行することができる。

$ ./a.exe
Hello, world!
sizeof(size_t) = 8

【参照リンク】

qiita.com

www.kkaneko.jp

qiita.com