MinGW(Minimalist GNU for Windows)は、Windows環境でGNUツールチェーン、特にGCC(GNU Compiler Collection)を利用可能にするための開発環境です。
Windows APIの
ヘッダファイルを提供することで、GCCを用いてネイティブなWindowsアプリケーションを開発できるようになります。MinGWプロジェクト自体は開発がほぼ終了していますが、その精神を受け継いだMingw-w64が積極的に開発を続けています。
MinGWの構成
MinGWプロジェクトは、主に
32ビット環境向けに2つの主要なパッケージを提供しています。一つは、Windowsに移植されたGCCであり、コマンドラインや
統合開発環境(IDE)から利用できます。もう一つは、軽量なUNIX風シェル環境であるMSYS(minimal system)です。MSYSには、端末エミュレータのrxvtや、autoconfなどの開発ツールを実行するためのコマンド群が含まれています。これらのMSYSのコンポーネントは、
Cygwinプロジェクトから派生したものです。
Win32 APIを利用するための
ヘッダファイルは
パブリックドメインで提供されており、誰でも自由に利用できます。一方、GNUツールの移植版はGPL(
GNU General Public License)
ライセンスの下で配布されており、MinGWの公式サイトから入手可能です。
名称の由来
MinGWという名称は、「Minimalist GNU for Windows」(Windowsのための最小限度のGNU)に由来します。また、Win32 APIの
ヘッダファイルを提供していることから、Mingw32とも呼ばれることがあります。MinGWの発音は確定していませんが、一般的には「ミン・ジー・ダブリュー」、「ミング・ウィー」、「ミン・グニュー」などと発音されています。
特徴
MinGWとMSYSを組み合わせても、全体として非常に軽量です。これらの環境は自己完結型であり、リムーバブルメディアから起動することも可能です。また、コンピュータの
レジストリやファイルシステムに影響を与えることはありません。
Cygwinと比較すると、
Cygwinはより多くの機能を提供するためにインストールが必要であり、管理も複雑になる傾向があります。
MinGWは
Linuxなどの非Windows OS上でのクロスコンパイルにも対応しています。これにより、Windows OSを使用せずにWindowsアプリケーションを開発することが可能になります。
MinGWは、
Cygwin 1.3.3をベースにフォークされました。両者ともUNIXソフトウェアをWindowsに移植することを目的としていますが、そのアプローチは異なります。
CygwinはWindows上に完全なPOSIX層を提供することを目指しており、互換性を重視するあまり、性能が犠牲になることがあります。一方、MinGWはコンパイラと関連ツールのみを提供し、性能を最優先に考えています。つまり、MinGWはPOSIX APIを提供していません。そのため、
Cygwinではコンパイル可能なUNIXアプリケーションの中には、MinGWではコンパイルできないものが存在します。これは、特定のPOSIX機能を必要とするアプリケーションや、POSIX環境を前提としたアプリケーションの場合に見られます。この問題を回避するためには、`cygwin1.dll`の関数を利用するか、eC(Ecere SDK)、
SDL、wxWidgets、
Qt、GTK、gnulibのようなプラットフォーム非依存のライブラリを使用する必要があります。
MinGWと
Cygwinは、
標準Cライブラリをはじめとする使用しているライブラリが異なります。MinGWは
マイクロソフトが提供する`msvcrt.dll`を使用するのに対し、
CygwinはPOSIX互換のために独自のDLLである`cygwin1.dll`を使用します。
Cygwinでコンパイルしたプログラムを配布する場合、ユーザーは`cygwin1.dll`も必要になります。これはソフトウェアと一緒に配布できますが、配布するソフトウェアはオープンソース
ライセンスに従う必要があります。MinGWでも、MSYSのライブラリ(`msys-1.0.dll`や`msys-z.dll`)をリンクしている場合は、同様の制限(GPL)を受けることになります。
移植時の注意点として、MinGWではネットワークプログラミングの`read/write`を`recv/send`に置き換える必要があります。これは、Windowsのソケットが
Winsockであり、POSIXとは異なるためです。MinGWは単なるツールチェーンであるため、この置き換えは今後も必要です。
以前は、
CygwinのGCCで`-mno-cygwin`オプションを使用することで、MinGW用のバイナリを作成することができました。しかし、gcc-4以降ではこのオプションは削除され、
Cygwin用のGCCとは別に、MinGW用のGCCがクロス開発用のコンパイラとして提供されるようになりました。例えば、2020年4月現在、
Cygwinの
64ビット版では、`gcc-core`が
Cygwin用、`mingw64-x86_64-gcc-core`がMinGW用(正確にはMingw-w64)です。
Cygwin用のGCCが`/usr/bin/gcc.exe`であるのに対し、MinGW用のGCCは`/usr/bin/x86_64-w64-mingw32-gcc.exe`のようにコマンド名のプレフィックスとして`x86_64-w64-mingw32-`が付いています。他のツールチェイン(`cpp`や`ld`など)も同様です。
Autotoolsで`configure && make`を行う際は、`configure`に`--host=x86_64-w64-mingw32`オプションを与えることで、Mingw-w64によるビルドが可能です。ライブラリの依存関係は`objdump -p ファイル名`で確認できます。
クロス開発環境
MinGWのバイナリは
Linux上で開発することが可能です。
Wineを使用することで、テストを簡単に行えます。RPMファイルは[2]から取得でき、
Fedoraでは[3]のようなSIGが立ち上がっています。クロスコンパイル環境でドライバを作成する際の注意点などは、[4]の記事が参考になります。
MinGWで作成できるアプリケーション
MinGWを使用して、以下の様なアプリケーションを開発できます。
Git(分散バージョン管理システム)
Windows PV driver for Xen(準仮想ドライバ)
Source Navigator(
統合開発環境・ソース解析ツール)
Ecere SDK(C言語の上位互換オブジェクト指向言語であるeC言語、
統合開発環境、GUIや3Dライブラリなどを中心に構成されたクロスプラットフォームのソフトウェア開発キット)
MinGWプロジェクト自体では
64ビット環境向けのコンパイラセットを提供していませんが、2007年にmingw.orgからフォークしたMingw-w64と、MinGWプロジェクトのMSYSを組み合わせることで構築できます。
その他
MinGWの開発環境としてはMSYSが標準的ですが、Eclipseや
DOSプロンプト、CLionでも開発が可能です。また、
Intel Threading Building Blocksも将来的にはMinGWでコンパイルできるようになる見込みです。
関連項目
Mingw-w64
GNUコンパイラコレクション(GCC)
Cygwin
TDM-GCC
Interix
Microsoft Windows Services for UNIX(SFU)
Subsystem for UNIX-based Applications(SUA)
出典
[1] MinGW 公式サイト
外部リンク
mingw.org - 2020年まで存在したかつてのホームページのWayback Machineの記録
MinGW OSDN Home
SourceForge Project Of The Month (September 2005)
MinGW FAQ(日本語)
Cygwin'>"-mno-cygwin" -- Building MinGW executables using
Cygwin
MinGW RSS
環境構築事例
VideoLANの場合(英語)