Skip to main content.

MinGW FAQ

MinGW について頻繁に尋ねられる質問と回答

本ページは MinGW 本家サイトの 「MinGW FAQ」を翻訳したものです。

更なる質問がある場合はMinGW メーリングリスト を参照して下さい。このページは MinGW の開発者によって、限られた時間の中で更新されたものです。 ここに挙げられている Q & A は MinGW メーリングリスト、MinGW メーリングリストのメンバ、様々な MinGW 関連サイトそして経験から得られたものです。この FAQ に寄与した全ての人々に感謝致します。

**注意** 我々は現在、"Old FAQ" の内容をこの FAQ に統合中です。現在 Old FAQ ページに記述されている情報は、いずれこの「文書」又は「ダウンロード」ページか、或いはやがて完成する「MinGW ユーザーズガイド」において公開されることでしょう。

目次

MinGW とは何ですか?

MinGW("Minimalistic GNU for Windows")とは GNU GCC 及び binutils プロジェクトに基づくコンパイラシステムの構築に利用されるランタイムヘッダ群を指します。 このコンパイラシステムは Win32 プラットフォーム上で実行可能なように、コードをコンパイル及びリンクします… C、C++ そして Fortran コンパイラに加えて、他の関連するツールも提供されています。 「MinGW」の代わりに「mingw32」という語を見ることがありますが、これらは共に同じコンパイラシステムを指しています。 このプロジェクトの名称が mingw32 から MinGW に変更されたのは、MinGW が 32 ビットシステムでしか動作しないと思われることを避けるためです (64 ビット又はそれ以上のマシンがより一般的になったとしても、MinGW はそれらのマシン上で動作するように進化します)。 MinGW は Windows オペレーティングシステムと共に配布されている Microsoft のランタイムライブラリを利用します。 Windows に対して移植された他の GCC とは異なり、 このランタイムライブラリは GNU 一般公有使用許諾契約書の元では配布されていません。 従って、あなたのプログラムと共にあなたのソースコードも配布する必要はありません。 勿論、あなたのプログラムが GPL のライブラリを利用していない限りですが…

MinGW がどのようにして始まったかについての興味深い物語については、 プロジェクトの歴史を参照して下さい。

MSYS とは何ですか?

MSYS、或いは Minimal SYStem とは、MinGW と共に利用する POSIX 及び Bourne シェル環境です。 Bourne シェルの構文で記述された特定の構成用スクリプトを実行するために、 MSYS は幾つかの選ばれたツールを提供します。MSYS によって、 大部分の GNU パッケージでは特定の構成用スクリプトを実行するだけで Makefile を作成することが可能となります。この Makefile は、ネイティブの MinGW バージョンの GCC を利用してパッケージをビルドするために利用出来ます。

MSYS で利用されている POSIX レイヤは、Cygwin バージョン 1.3.3 から分かれたものです。Cygwin は完全な POSIX レイヤ及び UNIX ライクな環境を Win32 に対して提供するもので、それにはサーバ及びクライアントユーティリティの両方が含まれています。

MSYS 特有の情報については、この Web サイトの MSYS のセクションを参照して下さい。

w32api とは何ですか?

w32api とは、Microsoft によって作成された Win32 アプリケーションプログラミングインタフェースをサポートするためのインポートライブラリとヘッダのパッケージです。 このパッケージなくして Windows プログラミングは不可能ですから、MinGW 開発チームは w32api の現在のメンテナとなっています。 このパッケージは Anders Norlander によって作成され、ライセンスにも制限はありません。 更なる情報については Anders による README ファイル README.w32api (日本語訳)を参照して下さい。

MinGW はどこから手に入りますか?

当初、MinGW は個別のパッケージ…MinGW ランタイム、このランタイムを利用してビルドされた様々なアプリケーション(gcc、ld など)、そして他の有用な構成要素(w32api ヘッダは Win32 API 用のコードに必要でした)の一分類でした。 必要となる個別のパッケージの最新版をダウンロードして、開発者は「彼ら自身用の」MinGW 環境を作り出しました。 これは初期のパッケージバージョンの活動的な状態(アップデートは絶えず投稿されていました)によって、必然的に発生したものでした…しかし、これはしばしば初心者を混乱させ、アプリケーション / ライブラリのベンダが「標準的な」MinGW 環境の構築を行う製品のデザインを行うことを困難にしていました。

その結果、開発が成熟しアップデートが急速にパッケージ化されなくなった 2001 年の中頃に、標準的な MinGW 環境のディストリビューションを収めた単一のファイル作成する決定がなされました。 この単一のアーカイブには各構成要素のパッケージのファイルが収められており、展開するだけで利用可能となります。 個別の構成要素のパッケージまだダウンロード可能です… もし特定のパッケージが全体のディストリビューションのリリースの間にアップデートされたとしても、新しいパッケージはインストール済みディストリビューション上に単純にインストール出来ます。

MinGW のファイル群は SourceForge で管理されています。 更なる情報とダウンロード用のリンクについては、ダウンロードのページを参照して下さい。

MinGW のライセンスは?

Colin Peters が MinGW ランタイムをリリースしたとき、彼はそのソースをパブリックドメインとしました。 そのため、誰もこのソースに対する著作権を所有していません。 あなたの目的に合っていると感じたのであれば、あなたはソフトウェア作者として商業用ソフトウェア、或いはオープンソースのソフトウェアに対して MinGW ランタイムを自由に使用することが出来ます。 あなたに出来ないことはソースの所有権を要求することと、Colin Peters の名前、MinGW の名前、又は何らかのプロダクトに裏書きされた MinGW に対して寄与した人間の名前を使用することだけです。

MinGW コンパイラシステムの著作権に関する実際の法的な詳細と技術的要旨については、 これらのコンパイラディストリビューションパッケージのヘッダ及びソースファイル中に含まれている著作権情報を参照して下さい。 以下の条項もまた適用されます。

MinGW ディストリビューションの一部に対して適用される様々なライセンスに対する、更なる参考情報源を以下に挙げます。

現在のバージョンは?

ダウンロードページのリリースセクションを参照して下さい。

古いバージョンは使えますか?

MinGW の最新のバージョンを利用することを強く勧めます。 古いバージョンには最新のバージョンに比べてより多くのバグがあり、その利用やインストールもより難しくなります。 最新のバージョンをダウンロードし、それを利用していることを確認して下さい。 バージョンを確認出来ない場合は、gcc -v とタイプすることによって利用しているバージョンを確認することが出来ます。

どんな言語がサポートされていますか?

MinGW-2.0.0-3.exe では、MinGW は C、C++、ObjC 及び Fortran 77 をサポートしています。 Ada は別のバイナリとして利用可能です。 Java(GCJ)はリリース候補として実装されており、次のメジャーリリースに含めることが出来るように、継続して作業が薦められています。 最後に、Pascal(GPC) もリリース候補として利用可能です。

何故私の C++ バイナリはこんなに巨大なのですか?

Standard Template Library (#include <iostream>)を利用する C++ プログラムでは、ライブラリの大部分がバイナリに静的にリンクされます。 stdc++ をバイナリに静的リンクする理由は二つあります。 まず、MSVCRT.dll は C++ stdlib constructs を含んでいないためです。 次に、libstdc++.dll を生成することはライブラリのライセンスによって制限されていると推測されるからです。 ファイルサイズを削減したければ、strip を利用することによってバイナリ中のデバッグ情報や他の情報を削除して下さい。

strip --strip-all SOMEBINARY.exe 

configure スクリプトを実行するにはどうすればよいですか?

通常、UNIX 方式のビルドプロセスを利用するアプリケーションでは、 configure スクリプトの実行及びビルドを行うためにシェル環境と POSIX ツール群が必要となります。 Cygwin 環境はかつてこの役割を充足する唯一の選択肢でしたが、 より軽量な代替品として MSYS 環境が MinGW の開発者達にリリースされました。 MinGW と共にこれらの環境を利用する方法の詳細については、これ以降で説明します。

どうすれば MSYS 環境内で MinGW を使えますか?

MinGW を利用可能なように MSYS 環境を構成するのはとても簡単です。 (Cygwin と共に利用するときのように)機能的に競合するようなものはないからです。 選択したディレクトリ内で各アーカイブの内容を単純に展開し、MinGW の「bin」サブディレクトリを PATH に追加して下さい(MSYS の「/etc/profile」、或いはシステム全体用の PATH のどちらを利用しても構いません)。MSYS の「/bin」をシステム全体用の PATH に追加する必要はありません。

MinGW と MSYS のパッケージは、ファイルシステム中のどこにインストールしても構いません。 一方がもう一方の内部に含まれていても大丈夫です (例えば、「mingw」サブディレクトリを「msys」ディレクトリの内部に作成してもよいのです)。 しかし忘れないで頂きたい重要なことは、MSYS の「bin」サブディレクトリの内部には、 MSYS と共に提供されている実行形式以外の実行形式を格納するべきではないということです。 そのため、二つのパッケージを「マージ」しようとはしないで下さい。

どうすれば Cygwin 環境内で MinGW を使えますか?

Cygwin に依存しない実行形式を作成すべく Cygwin 環境を開発に使いたいのであれば、 「-mno-cygwin」よりも容易な選択肢が存在します。 Cygwin と MinGW ディストリビューションを異なるディレクトリに単純にインストールし (例えば、「C:\CYGWIN と「C:\MINGW」のように)、 環境変数 PATH 中で MinGW の「/bin」サブディレクトリが Cygwin の「/bin」サブディレクトリの前に来るようにして下さい (例えば、「PATH=%PATH%;C:\MINGW\BIN;C:\CYGWIN\BIN」のように)。 これによって全ての UNIX ツールを利用することを可能としつつも、 GCC については MinGW バージョンが利用されることになります。

/etc/profile 中では、Cygwin はデフォルトで 「/usr/local/bin」、「/usr/bin」及び「/bin」 をシステムレベルの PATH の先頭に配置するということを肝に銘じておいて下さい。 そのため、Windows のパス中で MinGW の「/bin」を Cygwin の前に置くことは出来ません…Cygwin 環境内でも、MinGW の「/bin」は何よりも優先されなければなりません (「/etc/profile」を修正するか、手で設定を行って下さい)。

COM のサポートは含まれていますか?

MinGW には幾つかの COM プログラムのサポートが含まれています。 COM アプリケーションの作成については、プログラマは C++ よりも C を利用したほうがよいでしょう。 サポートの改良は現在も進められています。 COM に関する更なる詳細や例となるファイルについては、MinGW メーリングリストのアーカイブを調べてみて下さい。

MSVC のプログラムから MinGW DLL を呼び出すことや、その逆は可能ですか?

testdll.htestdll.c そして testmain.c があるとしましょう。最初のケースでは、MinGW で testdll.c をコンパイルし、MinGW でコンパイルされた testmain を実行します。このようになるでしょう。DLL と DEF ファイルを生成するには、次のようにします。

gcc -shared -o testdll.dll testdll.c \
-Wl,--output-def,testdll.def,--out-implib,libtestdll.a 

MSVC からは MinGW ライブラリを呼び出すことは出来ませんが、 既に DEF ファイルが手元にあるのですから、Microsoft の LIB ツールを利用して簡単に DLL を生成出来ます。

lib /machine:i386 /def:testdll.def 

もし testdll.lib を持っているのであれば、MSVC で実行ファイルを作るのは取るに足らない作業です。

cl testmain.c testdll.lib

これで、MinGW プログラムから MSVC の DLL を呼び出すことが出来ます。 これには二つの方法があります。一つの方法は、メインプログラムの後で LIB ファイルを直接指定することです。例えば、

cl /LD testdll.c 

の後で、

gcc -o testmain testmain.c testdll.lib 

を実行します。もう一つの方法は、GCC によって .a を生成することです。(多くの場合)__cdecl 関数に対しては、これは簡単です。Anders Norlander による reimp ツールを適用するだけです(彼の Web サイトは既に利用できなくなっていますが、 Jose Fonseca によって強化されたバージョンをダウンロードすることが出来ます)。

reimp testdll.lib
gcc -o testmain testmain.c -L. -ltestdll 

しかし __stdcall 関数に対しては、上記の方法ではうまく行きません。 MSVC では __stdcall 関数の前にアンダースコアが必要となりますが、MinGW はそうではありません。正しい方法は mingw-utils パッケージに含まれる pexports ツールを利用して DEF ファイルを生成し、sed によって最初のアンダースコアを削除します。

pexports testdll.dll | sed "s/^_//" > testdll.def 

そして、dlltool によってインポートライブラリを生成します。 「-U」をコマンドラインに追加して下さい。

dlltool -U -d testdll.def -l libtestdll.a 

そうすれば、通常の方法で生成出来ます。

gcc -o testmain testmain.c -L. -ltestdll 

いいぞ! 完了です。

どうすれば JNI DLL を作れますか?

JNI とは Java Native Interface の略です。 Java SDK をダウンロード及びインストールしなければなりません。 インストール先ディレクトリ(例えば c:\j2sdk1.4.1_02) は後ほど使いますので覚えておいて下さい。 もし MSYS を利用しているのであれば、/etc/fstab に以下のような行を追加し、MSYS を再起動します。

c:/j2sdk1.4.1_02      /java 

MSYS では以下の手順に従うことによって、JNI DLL を生成することが出来ます(注意: -Wl は「1」ではなくて「L」です)。

gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at \
-I/java/include -I/java/include/win32 \
-shared -o JavaImp.dll someJavaImp.c

通常のコマンドコンソールでは、以下のようにして生成します(一つの行として入力します)。

gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at 
-Ic:/j2sdk1.4.1_02/include -Ic:/j2sdk1.4.1_02/include/win32 
-shared someJavaImp.c -o JavaImp.dll 

ここで、JavaImp.dll.java ファイル中から参照される名前でなければなりません。 上記の DLL を利用するには、Java クラスのコード中で以下のようにして参照することになります。

System.loadLibrary( "JavaImp" ); 

何か問題が発生した場合は、CLASS_PATH 及び PATH が適切に設定されていることを確認して下さい。 JNI DLL を Java のコード中から利用するための更なる情報については、 Java Native Interface を参照して下さい。

クロスコンパイラをビルドするにはどうすればよいですか?

クロスコンパイルとは、あるプラットフォーム用のアプリケーションを別のプラットフォーム上で構築することを意味します(例: Microsoft Windows 用の実行形式を Linux 環境上でコンパイルする、或いはその逆)。 GCC は文字通り様々なプラットフォーム上に移植されており、理論上、MinGW ランタイムは様々なシナリオにおけるクロスコンパイル開発環境の構築のために利用することが出来ます。

Mumit Khan の手による、非常に古く時代遅れとなった mingw-cross-howto.txt が彼のサイトにあります。パッケージ群はアップデートする必要があるでしょう。 書き直す必要があるのですが、誰かやりませんか? もしもそのつもりがあれば、 mingw-users メーリングリストで名乗りを上げて下さい。

configure 用のスクリプトを完全にした、より新しい HOWTO が http://www.libsdl.org/extras/win32/cross/README.txt にあります。

crossgcc メーリングリストの アーカイブ を参照したくなるかもしれません。また、crossgcc FAQ へのリンクと、幾つかの有用なスクリプトの ftp ダウンロードサイトへの別のリンクもアーカイブの検索ページで見つかるでしょう。

幾つかのコンパイル済みバージョンもあります。

gcc.exe と mingw32-gcc.exe の違いは何ですか?

mingw32-gcc、mingw32-g++ などのバイナリはクロス開発用に用意されています。 これらは gcc の特定のビルドとして作成されました。 そのため、これらは GCC のメンテナによって、クロス開発用に配布されています。 mingw32-gcc バイナリは、mingw32 をターゲットとして実行されるバイナリを生成します。 一方、gcc.exe は生成されるバイナリのターゲットとビルド環境が同じであるバイナリであることを示しています。

Makefile とは何ですか? また、それを作成するにはどうすればよいですか?

Makefile はプレーンなテキストファイルであり、コンパイラの起動のような繰り返し行われる処理を削減するために利用されます。 Makefile 中の全てのインデント付けはスペースではなく、タブで行われるべきです。 Makefile の単純な例を以下に示します。これは「make」とタイプすることによって起動されます。

all:
     gcc -Wall -O3 -o hello.exe hello.cpp 

以下に示す例はより複雑なもので、変数及び他の機能の利用方法を示しています。

# これはコメントです。
SRC=hello.c main.c
OBJ=$(SRC:.c=.o) # ソースの .c を .o へと置き換えます。
EXE=hello.exe

CC=gcc
CFLAGS=-Wall -O3
LDFLAGS=-mwindows
RM=rm

%.o: %.c         # 次の行と結合されており、最近変更された .c ファイルをコンパイルします。
     $(CC) $(CFLAGS) -o $@ -c $<

.PHONY : all     # .PHONY は all という名前のファイルを無視します。
all: $(EXE)      # all は $(EXE) を完全に生成することに依存しています。

$(EXE): $(OBJ)   # $(EXE) は $(OBJ) に含まれる全てのファイルが存在することに依存しています。
     $(CC) $(OBJ) $(LDFLAGS) -o $@

.PHONY : clean   # .PHONY は clean という名前のファイルを無視します。
clean:
    -$(RM) $(OBJ) core    # '-' はエラーが発生しても、プロセスを終了させません

この Makefile は、以下のどのような方法からでも起動されます。

# 上記のファイルは、all ラベルで要求される全てをコンパイルします。
make

# 事実上、上の行と同じです。
make all

# 古いファイルを「clean」します。
# この Makefile では、hello.o、main.o 及び core を削除します。
make clean

# clean を行ってから、全てをビルドします。
make clean all

# 全てをビルドし、clean を行います。
make all clean 

Makefile に関する更なる情報については、 GNU make のドキュメントを参照して下さい。

なぜ make には mingw32-make.exe という名前が付けられているのですか?

make の「ネイティブ」(例: MSVCRT に依存する)の移植には幾つかの機能が欠けており、 Win32 における POSIX の欠如のために修正された機能もあります。 MSYS ディストリビューションには、MSYS ラインタイムに依存する バージョンの make も含まれています。この make の移植の動作はより期待通りのものであり、 実行時の悩みの種を減らしてくれます。この結果、ファイル名の衝突なしに「ネイティブ」バージョンと MSYS バージョンの両方が同居出来るように、MinGW の開発者 / メンテナ / パッケージャはネイティブバージョンの名前を変更するほうがよいという決定を行いました。

DOS のコマンドウィンドウを排除するにはどうすればよいですか?

リンク時に、コマンドラインに -mwindows スイッチを追加して下さい。

バグを報告するにはどうすればよいですか?

バグ報告ページを参照して下さい。