Documentation
文書
本ページは MinGW 本家サイトの 「Documentation」を翻訳したものです。
目次
MinGW のインストール
現在、インストールに関する情報はダウンロードのページにあります。
MinGW を利用したコンパイルとビルド
コンソールアプリケーションの作成方法
例を挙げましょう。以下のコードは単純な C プログラムの例です。 試しに、この部分を hello.c というファイルにカットアンドペーストしてみて下さい。
#include <stdio.h>
int main(int argc, char **argv)
{
printf ("Hello\n");
return (0);
}hello.c という C のファイルからコンソール形式の実行形式である hello.exe を作成するには、以下のようにします。
gcc -c hello.c
これによって hello.c はオブジェクトファイルである hello.o にコンパイルされます。
gcc -o hello hello.o
これによって hello.o から実行形式 hello.exe が作成されます。 代わりに、一つのステップを利用してコンパイルとリンクを行うことも出来ます。
gcc -o hello hello.c
以下のコードは単純な C++ プログラムの例です。試しに、この部分を hello.cpp というファイルにカットアンドペーストしてみて下さい。
#include <iostream>
int main(int argc, char **argv)
{
cout << "Hello" << endl;
return (0);
}C++ プログラムでは、以下のようにしてコンパイルとリンクを行います。
g++ -c hello.cpp
g++ -o hello hello.o
Windows アプリケーションの作成方法
例を挙げましょう。以下のコードは単純な Windows プログラムの例です。
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
MessageBox (NULL, "Hello", "Hello Demo", MB_OK);
return (0);
}hello.c という C ファイルから Windows の実行形式である hello.exe を作成するには、以下の手順に従います。
gcc -c hello.c
これによって hello.c はオブジェクトファイルである hello.o にコンパイルされます。
gcc -o hello hello.o -mwindows
これによって hello.o から実行形式 hello.exe が作成されます。
コンソールアプリケーションの代わりに
Windows の実行形式を作成するためには
-mwindows スイッチが必要です。
このスイッチは適切な Windows ライブラリをリンクします。
標準的な Windows アプリケーションではあるがコンソールスクリーンも必要という場合は、-mwindows
に加えて -mconsole フラグも追加して下さい。
実行形式にリソースファイル(.rc)内のリソースを追加することも必要ならば、他のソースファイルと同様にリソースファイルもコンパイルし、実行形式を作成する際にコンパイルされたリソースも含めてリンクする必要があります。 以下に挙げる例は、resfile.rc というリソースファイルをコンパイルし、そしてリンクする方法を示しています。
windres -o resfile.o resfile.rc
gcc -o hello hello.o resfile.o -mwindows
DLL の作成方法
例を挙げましょう。この部分を dllfct.h というファイルにカットアンドペーストしてみて下さい。
#ifdef BUILD_DLL // the dll exports #define EXPORT __declspec(dllexport) #else // the exe imports #define EXPORT __declspec(dllimport) #endif // function to be imported/exported EXPORT void tstfunc (void);
この部分を dllfct.c というファイルにカットアンドペーストしてみて下さい。
#include <stdio.h>
#include "dllfct.h"
EXPORT void tstfunc (void)
{
printf ("Hello\n");
}この部分を hello.c というファイルにカットアンドペーストしてみて下さい。
#include "dllfct.h"
int main ()
{
tstfunc ();
return (0);
}これらから DLL と実行形式を作成するには、以下のようにします。
gcc -c hello.c
gcc -c -DBUILD_DLL dllfct.c
dllwrap --output-lib=libtstdll.a --dllname=tst.dll --driver-name=gcc dllfct.o
gcc -o hello.exe hello.o -L./ -ltstdll
DLL に関する更なる詳細については、 http://www.nanotech.wisc.edu/~khan/software/gnu-win32/dllhelpers.html を参照して下さい。
DLL 用の DEF ファイルの作成方法
定義ファイル(.def)が提供されていなくとも、様々な方法で定義ファイルを作成することが可能です。
-
一つの手段は MinGW ユーティリティパッケージ「mingw-utils」に含まれているツール「pexports」です。
最新版についてはダウンロードのページを参照して下さい。
DLL が Pascal 呼び出し規約に従っている関数を含んでいる場合、
-oを利用する必要があるでしょう。 - 別の手段としては、ツール impdef が挙げられます。DLL から DEF ファイルを作成する方法に関する更なる情報、 impdef の本体、そして impdef の利用方法に関する更なる情報については、 Colin Peters のサイトから入手可能です。 チュートリアルセクションを参照して下さい。 他のコンパイラもまた、全てのコンパイラで利用可能な .def ファイルを作成するための impdef プログラムを提供していることでしょう。 他のコンパイラから別のバージョンの impdef を手に入れている場合、それを利用したいと思うかもしれません。 あるものは他のものよりも上手に Pascal 呼び出し規約を取り扱います。 Borland は impdef のあるバージョンを提供しており、他のコンパイラユーティリティも Borland コミュニティの Web サイトからダウンロード可能です。 Borland C++ バージョン 5.5 のコンパイラには、標準的なフォーマット、Borland のフォーマットそして Microsoft のフォーマットの相互変換を補助するための様々なユーティリティが含まれています。
-
別の手段として MinGW ディストリビューションに含まれる
nm を利用する方法が挙げられますですが、この方法は全ての DLL に対して適用出来ません。
DLL がストリップされているか、16 ビットでコンパイルされている場合には問題が発生します。
このテクニックを利用するためには、nm が出力する内容を DEF ファイル用に加工するフィルタが必要になります。
この作業はエディタを用いて行うことも出来ますが、Perl (Practical Extraction and Report Language) や grep (global
regular expression print)、又は sed (stream editor)のようなツールを利用して自動化することも可能です。
自動化する方法を利用するには、DLL 内部で利用されている Pascal 呼び出し規約を手で修正する必要が出てくるでしょう。
この方法に関する更なる詳細については、Colin Peters のサイトを参照して下さい(sed と grep は GNU のツールを
MS-DOS に移植したアーカイブを収録した様々なサイトや、
Win32 に移植した一般的な UNIX ツールを保持している
Virtually Un*x のようなサイト、或いはセルフホストの MinGW
移植ディストリビューションから入手可能です。
Perl の ActiveState バージョンは、Win32 プラットフォーム上でもちゃんと動作します)。
以下に利用可能なフィルタリングテクニックの例を示します。
-
この例では grep と sed を利用しています。 file.dll という名前の DLL があり、この DLL から file.def という名前の DEF ファイルを作成する場合は、以下のようにします。
echo EXPORTS > file.def nm file.dll | grep ' T _' | sed 's/.* T _//' >> file.def
DLL と DEF ファイルから file.a という名前のライブラリファイルを作成する場合には、以下のようにタイプします。
dlltool --def file.def --dllname file.dll --output-lib file.a
-
この例では Perl を利用しています。 以下の Perl スクリプトを dll.pl というファイルにコピーして利用します。
open (OUTFILE,">dll.def"); print OUTFILE "EXPORTS\n"; open (INFILE,"dll.fil"); while(<INFILE>) { if ($_ =~ /T _/) { $line = $_; $line =~ s/.* T _//; print OUTFILE $line; } } close (INFILE); close (OUTFILE);file.dll という DLL がある場合、コマンドラインから以下のようにタイプします。
nm file.dll > dll.fil perl dll.pl
dll.def というファイルが生成されます。必要であれば名前を変更して下さい。 この処理が完了したなら、恐らく dll.fil も削除したいと考えるでしょう。
-
-
システム内にこれらのツールがないとしても、 エディタを利用して手で編集するのであれば DEF ファイルを作成するために nm を利用することが出来ます。以下に例を示します。
nm file.dll > dll.fil find " T _" dll.fil > dll.def
find プログラムによって作成された dll.def の先頭にある、ファイル名が示されている行を EXPORTS という行に置き換えます。エディタで
T _を検索して、その部分とその行の前にある全てを削除し、 このファイルにはルーチン名のみを残すようにします。 -
これまでの方法が利用出来ない場合でも、objdump プログラム
(MinGW ディストリビューションに含まれています)
の出力を利用して def ファイルを作成することが出来ます。以下に例を示します。
objdump -p file.dll > dll.fil
dll.fil から[Ordinal/Name Pointer] Tableを探し、この行に続くリストを利用して DEF ファイルを作成します。
GNU による開発ツールの文書
- GNU の文書 (全ての GNU ツール群の文書)
- GCC のマニュアル
- GNU リンカ
- GNU Binutils
- GNU バイナリファイル記述ライブラリ(BFD: Binary File Descriptor library)
- GNU アセンブラ
- コンパイル済み HTML Help (Jos Fonseca が、GNU ツールの様々な文書を Microsoft HTML Help 形式に変換したものです)
Win32 API の文書
MinGW は OS と共に配布されているランタイムライブラリを利用していますが、 OS は API の文書をサポートしてませんし、その文書は再配布可能でもありません。 Microsoft の開発ツールを持っていなかったり、又は MSDN サブスクリプションに参加していないとしても、 以下に挙げる場所から API の文書にアクセスすることが出来ます。
- Microsoft によるオンラインライブラリ。
- Windows API の文書 (サイズ: 12.8MB 最終更新日: 1999 年 11 月 9 日(火)(米国東部標準時))。 これを再配布可能とする許可を Microsoft から得た Jacob Navia の粘り強さに感謝します。
- WinHelp フォーマットの Win32 API の文書(6MB)。 Windows 3.1 と Win32 API の違いを示すためのヘルプファイルで、Microsoft によって 1992 年にリリースされました。
- WIN32.ZIP (7.9MB) には Delphi 用の Borland/Inprise API が記述されています。 これに含まれているのは Win32 API に関する記述だけで、C ランタイムライブラリに関する記述は含まれていません。
Tips, HOWTO, 寄贈された文書、など
** 注意 ** 本セクションの幾つかの情報は古くなってしまい、現在では歴史的な記録となってしまっていると思われます。 特に、「-mno-cygwin」及び Cygwin 開発環境における MinGW の利用に関する最新かつ適切な情報については、FAQを参照して下さい。
イントロダクションとチュートリアル
-
Mike Linkovich による MinGW スタートアップガイド
MinGW の導入と利用に関する大変優れた入門書です(グラフィックスやゲームの開発に関しては特に重要です)。 MinGW と共に利用可能な幾つかの特定のそして便利な外部ライブラリと、IDE(訳注: 統合開発環境)について述べられています。 - GNU C と C++ を利用した Win32 プログラミング にある、Colin Peters によるチュートリアル
-
GCC を利用した DLL の作成方法
MinGW と Cygwin の gcc の C、C++ そして Fortran 77 を利用した DLL の作成に関するヘルパープログラムと例が挙げられています。 バージョン 0.2.5 が 1999 年 5 月 13 日にリリースされました。 Microsoft のオンラインアーカイブから得られる、DLL に関連した情報に関する幾つかの情報も含まれています。
特定のソフトウェアパッケージに対する開発用モジュール
-
GNU コンパイラを利用して Java JNI を作成するには?
まず最初に README.jni を読みましょう。続いて java-jni-examples.zip をダウンロードします(最終更新日: 1999 年 4 月 22 日)。 -
GNU コンパイラを使って Excel から呼び出せる DLL を作成するには?
まず最初に README.excel-dlls を読みましょう。続いて excel-dlls.zip をダウンロードします。 -
GNU コンパイラを利用して Netscape クライアントプラグインを作成するには?
まず最初に README.nsplugin を読みましょう。続いて nsplugin-examples.zip をダウンロードします(最終更新日: 1999 年 4 月 8 日)。
クロスコンパイルと他のツールの利用
-
-mno-cygwin: Cygwin を利用した MinGW 実行形式の作成
Cygwin 開発ツールを利用した MinGW アプリケーションの作成に対する、幾つかの 見識と忠告 (訳注: 日本語訳を 「"-mno-cygwin" -- Cygwin を使用した Mingw 実行形式のビルド」として用意しています)。 -
MinGW 用のクロスコンパイラの作成
MinGW 用のクロス開発ツール、及び Canadian クロス開発ツールを作成する方法について述べた説明書(1999 年 2 月 17 日)。