Windows MinGW開発環境¶
はじめに¶
MinGW(Minimalist GNU for Windows)は、Windows OSにおけるGCC由来のC/C++開発環境です。
GCCを含むツールチェイン一式が移植されています。
MinGWは、Windowsアプリケーションをビルドすることを目的としており、ランタイムライブラリはMicrosoftが提供するMSVCRTを使用します。
Win32APIを利用するヘッダーファイルが含まれています。一方、Windows OSがPOSIXをサポートしていないので、MinGWではPOSIX APIをサポートしていません。
Windows上でPOSIX環境を実現するなら、Cygwinなどを使用するのがよさそうです。
なお、本記事ではMinGWの64bit版を扱います。
MinGW-w64¶
MinGW-w64は、MinGWから2007年に派生した、64bit対応と追加APIを提供するプロジェクトです。MinGW-w64は、ヘッダーとライブラリの提供を主としています。
公式サイトは、 http://mingw-w64.org です。
インストール¶
インストーラの入手¶
公式サイトにアクセスし、上段のメニューから[Downloads]のリンクをたどります。
MinGW-w64本体は、GCCやbinutilsは提供していないので、開発環境としてMinGW-w64に必要なツール等を付加したパッケージがいくつか存在します。
2015-09-05時点では、Windows向けには次のパッケージがリストに記載されています。
- Mingw-builds
- Msys2
- Win-Builds
今回は、オーソドックスと思われるMingw-buildsを使用します。Mingw-buildsのリンクをクリックすると、Sourceforgeへのリンクが現れるので、それをクリックします。
すると、mingw-w64-install.exe がダウンロードされます。
オフラインインストール用のダウンロード¶
インターネットに接続できない環境では、mingw-w64-install.exeによるインストールができないので、別途オフラインインストール用のファイルも入手しておきます。
http://sourceforge.net/projects/mingw-w64/
にアクセスし、[Brawse All Files]のリンクをたどります。
[Toolchains targetting Win64]のリンクをたどり、[Personal Builds]のリンクをたどり、[mimgw-builds]のリンクをたどり、最新っぽいバージョン(2015-09-05時点では5.1.0)のリンクをたどり、[threads-posix]のリンクをたどり(マルチスレッドライブラリにpthreadを使う場合)、[seh]のリンクをたどり(例外機構にSEHを使う場合)、そこにあるアーカイブファイルをダウンロードします。
- x86_64-5.1.0-release-posix-seh-rt_v4-rev0.7z
インストール¶
先にダウンロードしたファイルを実行します。
- mingw-w64-install.exe
インストーラが立ち上がります。
Settings画面では、GCCのバージョン、アーキテクチャ、スレッドライブラリの種類、例外機構の選択をします。今回は次の画面のように選択しました。
Installation folder画面では、インストール先ディレクトリを選択します。デフォルトでは、C:\Program Files\mingw-w64\x86_64-5.1.0-posix-seh-rt_v4-rev0
となっていました。今回はデフォルトとします。
C:\Program Filesmingw-w64\x86_64_5.1.0-posix-seh-rt_v4-rev0 +-- mingw64 | +-- bin | +-- etc | +-- include | +-- lib | +-- libexec | +-- licenses | +-- opt | +-- share | +-- x86_64-w64-mingw32 +-- mingw-w64.bat +-- mingw-w64 +-- uninstall.exe +-- uninstall.ini
MSYSツールのインストール¶
MinGW 64に含まれるのはGCCの最小限のツールだけです。bashシェル環境、autoconf、bizon、flex、make、cvs、svn、git、mercurial、zip、7zipなどなどのツール群を使うために、MSYSをインストールします。
入手¶
http://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/
ここから、最新レビジョンのmsysアーカイブファイルを入手します。- msys+7za+wget+svn+git+mercurial+cvs-rev13.7z
展開¶
展開先は、C:\Program Files\tools\msysとしました。次のディレクトリ構造となります。
C:\Program Files\tools\msys +-- bin +-- doc +-- etc +-- lib +-- libexec +-- local +-- patches +-- sbin +-- share +-- ssl +-- var
環境変数の設定¶
SET MINGW_HOME=C:\Program Files\tools\mingw64 SET MSYS_HOME=C:\Program Files\tools\msys PATH=%PATH%;%MINGW_HOME%\bin;%MSYS_HOME%\bin
コンソール¶
msysのインストールディレクトリ直下にmsys.batがあります。これを実行するとシェル環境のコンソールが起動します。
トラブルメモ¶
リンクエラー¶
relocation truncated to fit: R_X86_64_32 against symbol ...¶
AMD64(Windows 64bit版が動くプロセッサモデル)では、複数のメモリモデルが存在しています。
Linux上のGCCでは次のメモリモデルが用意されています。
メモリモデル | コードサイズ上限 | データサイズ上限 | 備考 |
---|---|---|---|
small | 2GB | 2GB | デフォルト |
medium | 2GB | 無制限 | |
large | 無制限 | 無制限 |
GCCのオプション-mcmodelで指定可能です。
Windows上ではどうなのでしょうか?
http://software.intel.com/en-us/articles/memory-limits-applications-windows/
Intelコンパイラの説明によると、静的データサイズは2GB、動的データサイズは8TB、スタックデータサイズは1GBが上限とあります。
64-bit
Static data - 2GB
Dynamic data - 8TB
Stack data - 1GB (the stack size is set by the linker, the default is 1MB. This can be increased using the Linker property System > Stack Reserve Size)
http://www.softek.co.jp/SPG/Pgi/win64/index.html
PGIコンパイラ製品の説明を抜粋します。
64ビット Windows版の PGI コンパイラでは、2GB以上の単一オブジェクトを扱うことができる Linux上の -mcmodel=medium オプションと等価な機能を提供しておりません。これは、Microsoft® Win64 プログラミング・モデルが、2GB を超える「静的な単一データオブジェクト」のハンドリングをサポートしていないためです。従って、2GB を超える「静的」配列を扱うようなプログラムでは、実行モジュールを生成できません。たとえ Windows® 64ビット版であっても、2GB を超える単一配列オブジェクトがプログラム上に存在する場合、静的な配列宣言はできず、動的な配列宣言(Allocatable 配列宣言)を行う必要があります。これは、PGI コンパイラの制約ではなく、Win64 プログラムモデルの問題です。従って、2GB 以上のデータオブジェクトを扱うプログラムをコンパイルする場合は、現在のところ、このような制約がない Linux 版の方が適しています。