MinGW 5.0.2 のインストール
〜 Windows 用 gcc で Python を拡張 〜
2006-05-08 作成 福島


MinGW のインストール

MinGWDownload -> File List から MinGW-5.0.2.exe をダウンロードし、インストール
インストーラは 130KB 程のサイズしかありません。
本体をインターネットからダウンロードするように出来ています。
・ダウンロード&インストール
・ダウンロードのみ
2 通りから選択します。
北陸先端大学のサーバが休みだったのでけいはんなのサーバを指定しています。
パッケージはデフォルト (Current) を選択しています。
インストールコンポーネントの選択
コンポーネントは Base だけでも良いのですが MinGW は gcc なので make (mingw32-make.exe) も選択しています。
合計で 54.1MB 必要と表示されています。
インストールフォルダの選択
デフォルトのままを押します
スタートメニュー名の指定
デフォルトのままを押します
コンポーネントのダウンロード
インターネットに接続できないとインストール出来ません。
ダウンロード&インストールを選択したのでインストールも行っています。
を押して終了。


環境変数を編集
検索パスを編集して gcc を起動しやすくします。
マイコンピュータ - プロパティ(R) をたどると「システムのプロパティ」が開きます。
「詳細」タブの を押すと環境変数のダイアログが開きます。


下段に「システム環境変数(S)」があるので Path を選択して を押します。

変数値(V): の最後に ;C:\MinGW\bin を追加して を押します。
; (セミコロン) は検索パスの区切り文字です。忘れずに記入します。
C:\MinGW は MinGW-5.0.2 のインストールで指定したディレクトリです。



いつものように "Hello world."
C:\tmp\helloworld.c

#include    <stdio.h>

main()
{
    printf("Hello world.\n") ;
}

コンパイル&実行
■コマンド プロンプト 
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\tmp>gcc -o helloworld.exe helloworld.c

C:\tmp>dir helloworld.exe
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 0834-3CA7 です

 C:\tmp のディレクトリ

2006/04/30  03:11               15,663 helloworld.exe
               1 個のファイル              15,663 バイト
               0 個のディレクトリ   1,623,658,496 バイトの空き領域

C:\tmp>strip helloworld.exe       --- strip も使えます

C:\tmp>dir helloworld.exe
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 0834-3CA7 です

 C:\tmp のディレクトリ

2006/04/30  03:12                5,632 helloworld.exe
               1 個のファイル               5,632 バイト
               0 個のディレクトリ   1,623,666,688 バイトの空き領域

C:\tmp>.\helloworld.exe
Hello world.

C:\tmp>


Python の DLL を MinGW で作成

インポートライブラリ (libpython24.a) の用意 (Python 2.4 には既に libpython24.a が存在しているので、通常は不要です)
PExports 0.42h をダウンロードし、解凍

copy C:\Python24\libs\libpython24.a C:\Python24\libs\libpython24.a.org --- 元の libpython を退避
.\pexports-0.42h\bin\pexports.exe C:\WINDOWS\system32\python24.dll > .\python24.def --- DLL からシンボルテーブルを作成
C:\MinGW\bin\dlltool.exe --dllname python24.dll --def .\python24.def --output-lib C:\Python24\libs\libpython24.a --- DLL とシンボルテーブルからインポートライブラリを作成
python C:\Python24\Tools\Scripts\setup.py build --compiler=mingw32 --- .pyc を再作成
ソースファイルを作成
example.c (ファイル名は何でも良い)
#include	<Python.h>	//--- Python API ヘッダの指定
// Python.h には既に stdio.h string.h errno.h stdlib.h のインクルード指定が含まれています

// メソッドの実体
static PyObject* exec_do(PyObject* self, PyObject* args)
{
	const char*	command ;	//--- command は PyArg_ParseTuple によって alloc される
	int	status ;

	if (!PyArg_ParseTuple(args, "s", &command))
		return NULL ;
	status = system(command) ;

	return Py_BuildValue("i", status) ;
}

// メソッドテーブル
//  メソッド名 / 関数へのポインタ / 呼び出し規則 / 説明書き(何を書いても良い)
//   python の help から参照することができます。
static PyMethodDef executerMethods [] = {
	{ "do", exec_do, METH_VARARGS, "Execute command for Command-prompt in Windows." },
	{ NULL, NULL, 0, NULL }
	} ;

// モジュールの初期化関数 (Python にモジュール名とメソッドテーブルを渡します)
PyMODINIT_FUNC initexecuter(void)	// 初期化モジュール名は init + "DLL 名" にする必要があります。
{
	Py_InitModule("executer", executerMethods) ;  // モジュール名は DLL 名と同じにする必要があります。
}
ソースファイルから DLL を作成
C:\MinGW\bin\gcc -I C:\Python24\include -c -o example.o example.c
C:\MinGW\bin\dllwrap --driver-name gcc --dllname executer.dll example.o C:\Python24\libs\libpython24.a
以下のエラーメッセージが出ますが正常です。
dllwrap: no export definition file provided.
Creating one, but that may not be what you want
DLL を import して実行
(sys.path はカレントディレクトリを含むので、DLL をシステムツリーに入れなくても実行が可能です)
(完成したら C:\Python24\DLLs\ に入れましょう)
■コマンド プロンプト - python 
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\tmp>python
Python 2.4.3 (#69, Mar 29 2006, 17:35:34) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.

>>> import executer
>>> result = executer.do("dir")
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 0834-3CA7 です

 C:\tmp のディレクトリ

2006/05/08  22:26    <DIR>          .
2006/05/08  22:26    <DIR>          ..
2006/05/08  22:25             1,001 example.c
2006/05/08  22:25             1,056 example.o
2006/05/08  22:25            15,369 executer.dll
               3 個のファイル              17,426 バイト
               2 個のディレクトリ  147,784,990,720 バイトの空き領域
>>> result
0
>>> ^Z
C:\tmp>