流石に詰まりまくったのでまとめることにする。
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をインストールしてみてください。
以上で終わりです。お疲れ様でした!
コメント