利用 MinGW 與 boost::python 建立 64bit 的 python 模組

時隔多年的文章,這次要介紹的是,如何使用 64bit MinGW 與 boost::python 來建立 64 bit  python 的 C++ 模組。

若你是使用 MSVC 的話,基本上只要看官網上面的介紹就可以輕鬆建立 C++ 的模組。使用 MinGW 的話,若你只是要建立 32 bit 的模組也是照官網上面指示即可。但是當你使用 64 bit 的 MinGW 的話,要建立 64 bit 的 python 模組的話,這官網指示是會有點問題的。

在摸索一段時間後,總算發現出真正可行的作法。以下簡單說明一下。

目標:使用 64bit MinGW 與 boost::python 建立 64bit 的 python 的 C++ 模組

基本需求:

[1] 64 bit 的 MinGW,這裡你這可以用 tdm gcc。我使用的版本是 4.8.1

[2] 64 bit 的 python,這個你可以到官網抓安裝檔案即可。2.7 或 3.4 系列都可以。
[3] boost lib,這個到官網抓最新的版本即可。我使用 1.55。

步驟:

[1] 先編譯出 boost::python,這個 lib 是 boost 裡面的其中一支。編譯指令如下:

b2 toolset=gcc address-model=64 variants=debug,release link=static,shared threading=multi define=MS_WIN64 with-python stage
這裡的重點是 "define=MS_WIN64" ,其他的項目你可以是你需求來改變,但是這個 "define=MS_WIN64" 一定要加上。
原因是 64bit 的 python lib 是利用這個 MS_WIN64 來選擇 64 bit 的函數,而 MSVC 裡面有預先定義,MinGW 裡面沒有,所以照官網的作法會在編譯模組時發生錯誤。

[2] 準備 64 bit 的 python lib 。
在 32 bit 的安裝檔案中 libpython27.a (32bit) 或是 libpython34.a (32bit) 是會安裝到電腦裡面的,但是 64 bit 的沒有。
若要繼續接下來的 python 模組編譯的話,需要 64bit 的 libpython27.a (或 64bit 的 libpython34.a) 檔案,若沒有就無法繼續接下來的步驟。
好險,在 MinGW 中有可以將 dll 檔案轉成 a 檔案的工具,所以我們可以將 python27.dll (或 python34.dll )轉成 libpython27.a (或 libpython34.a) 。
 
(若你安裝 64 bit 的 python 的話,那麼 python27.dll 就是 64bit 的。而 32bit 的 python 裡面同樣檔名的 python27.dll 是 32 bit 的,這兩者名稱一樣內容不一樣歐。) 
 
指令如下:若要不同版本的,請先安裝對應版本的 python,再替代下面指令的 "27"
(a) gendef.exe python27.dll
這個指令會由 python27.dll 中產生 python27.def (若你的 MinGW 裡面沒有 gendef.exe 的話,可以在網路上找到替代的軟體,只要可以產生 def 檔案就好。)
(b) dlltool.exe dllname python27.dll def python27.def output-lib libpython27.a 
這個指令會產生 libpython27.a
再完成 libpython27.a 之後把他複製到 python 安裝資料夾底下的 libs 裡面
 
[3] 在準備好 [1] 與 [2] 之後,基本上就只要照 boost::python 官網上面的指示就可以利用 64bit MinGW 順利編譯出 64 bit 的 python C++ 模組了。
這裡唯一需要注意的是,在使用 bjam 或 b2 指令時,還是要加上 define=MS_WIN64 這個定義,原因上面有解釋。
 






留言

這個網誌中的熱門文章

XBOX 360 無線手把 控制器 簡易維修

建立 boost 的時間要好久啊!