プロジェクト

全般

プロフィール

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のバージョン、アーキテクチャ、スレッドライブラリの種類、例外機構の選択をします。今回は次の画面のように選択しました。

install-1.png

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 版の方が適しています。