Python x64 & MinGW64 環境の構築

Python
スポンサーリンク

流石に詰まりまくったのでまとめることにする。

MSYS2 をインストール

個人的にこれからメインで使いたいと思っているbash ツールのMSYS2。ConEmuと使うと、とっても幸せな気分になれます。

x64版をインストール。

msys2を起動し、pacmanで必要なものをインストール。

yes | pacman -Sy
yes | pacman -Su
yes '' | pacman -S mingw-w64-x86_64-toolchain
yes | pacman -S vim git openssh unzip rsync winpty
yes | pacman -S bash pacman pacman-mirrors msys2-runtime

以下にPathを通す。

C:\msys64\mingw64\bin

libpython27.a の作成

どうやら、標準のlibpython27.aではうまくコンパイルしてくれないらしい。

先ほどインストールしたmsys2上から、DLLのライブラリの作成を行う。

C:\Windows\System32 にあるpython27.dll を作業用ディレクトリに保存。

bash から 作業用ディレクトリに移動し、以下のコマンドを実行

gendef python27.dll
dlltool --dllname python27.dll --def python27.def --output-lib libpython27.a

libmsvcr90.aの作成

標準のままだと、ちゃんとmsvcr90.dllにリンクをうまく張ってくれないので、libmsvcr90.aも自作します。

python27.dllをDependency Walkerを使って分析します。

使用しているmsvcr90.dllのFull Pathを取得。そのディレクトリから、msvcr90.dllを作業ディレクトリに持ってきます。

同様に以下のコマンドを実行。

gendef msvcr90.dll

msvcr90.def ファイルができるので、テキストエディタで開きます。

;atexit
;_decode_pointer
;_encode_pointer

上3行を見つけてコメントアウト。

dlltool --dllname msvcr90.dll --def msvcr90.def --output-lib libmsvcr90.a

libmsvcr90.aファイルを作成。

libpython27.aとlibmsvcr90.aをlibsフォルダに保存

インストールしたPythonのルートフォルダのibsフォルダに作成した2つのファイルを保存します。上書きされるのもあるので、念のためバックアップを取ったほうがいいです。

mingwpyのインストール

このままでは、GCCにmanifestファイルが渡されないため、きちんとmsvcr90.dllへのリンクが渡されません。そのため、invalid access to memory が頻繁に表示され、自前のC拡張ライブラリが使えないことがしばしばです。mingwpyを入れれば、適切にmanifestを適応したpydファイルにしてくれます。

pip install -i https://pypi.anaconda.org/carlkl/simple mingwpy

※これ、本当に困りました。Dependency Walker で見ても、明らかにmsvcr90.dllへのリンクがちゃんとできてない。manifestの設定方法を調べていてもなかなか出ない等・・。mingwpyで全て解決。

遭遇するであろうエラーとその解決

これで作業が終わって欲しいところなんですが、標準のPythonのincludeファイルをいくつかいじらないと、ちゃんとコンパイルしてくれません。

undefined reference to `__imp_Py_InitModule4′

Pythonのルートフォルダから、include\pyconfig.h を開きます。

#ifdef _WIN64
#define MS_WIN64
#endif

141行目にあるこの3行を #ifdef _MSC_VER の上の107行目に移動させます。

multiple definition of `atexit’

msvcr90.defファイルのコメントアウトをしっかりしていないと、このエラーが表示されます。

DLL load failed: メモリ ロケーションへのアクセスが無効です。

gccにちゃんとmanifestが渡されていないようです。mingwpyをインストールしてみてください。

以上で終わりです。お疲れ様でした!

参考

MSYS2

MSYS2で快適なターミナル生活 – Qiita
はてブ数
MSYS2で快適なターミナル生活Windowsでコマンドラインの環境を整えるには、MSYS2が優秀だ。デフォルトのターミナルはmintty、シェルはbash、パッケ...

Python x64 MinGW64の設定

コメント

タイトルとURLをコピーしました