試圖解決SWIG問題
撰寫批次檔 :
依照http://www.ittc.ku.edu/kusp/kusp_docs/kusp_swig_guide/index.html提供的gcc指令,撰寫了3個批次檔來執行。
第一個命名為interface.bat,用來讓swig生成"_wrap.c"檔,並建立"build"和"dist"兩個資料夾。
@echo off set interface_name=example echo 編譯接口 swig -python -py3 %interface_name%.i echo 編譯完成 pause REM MKDIR echo 正在建立目錄 MKDIR "build" MKDIR "dist" echo 目錄已建立 pause
第二個是pyd.bat,主要是下gcc的編譯指令並執行runme.py,不過不知道修改後正不正確。
原理是將example.c和它的_wrap.c參照W:/Python35/include的內容變成".o"檔,再將它們參照W:/Python35/libs/libpython35.a編譯成".pyd"檔。
@echo off set target_name=example set module_name=example echo 正在建立暫存檔 gcc -c -g %target_name%.c %target_name%_wrap.c -IW:/Python35/include move %target_name%.o build\%target_name%.o move %target_name%_wrap.o build\%target_name%_wrap.o echo 暫存檔建立 pause echo 正在建立PYD gcc -shared build/%target_name%.o build/%target_name%_wrap.o W:/Python35/libs/libpython35.a -o dist/%module_name%.pyd echo PYD建立 copy /Y runme.py dist\runme.py python dist\runme.py pause
第三個式失敗後重來的清除工具,刪掉前面建立的檔案和成果檔。
@echo off set target_name=example echo RMDIR... RMDIR /S /Q .\build RMDIR /S /Q .\dist echo DEL... del /F /S /Q %target_name%_wrap.c del /F /S /Q %target_name%.py pause
檔案如下圖:
將interface.bat和pyd.bat分開的原因是為了檢察途中example.i和example_wrap.c是否出了問題。
執行測試 :
之前的example.c和example.i內容並沒有更動。
第一次執行後,發現會出現以下錯誤:
然後就發現example_wrap.c中的這句錯誤了,多了一個底線符號,刪除後就能導入了。
這個錯誤經過搜索後是SWIG本身的問題,要解決的話必須重新編譯原始碼。
但是這個舉動實在是太耗費時間了,所以後來放棄了。
不過更改那行後,runme.py就可以導入example.pyd,不過卻會出現TypeError,如下圖:
估計是這裡有錯誤:
不過不知道怎麼調整。
SWIG在自身的編譯上有點小錯誤,但是有些地方因為不了解Python的模組,所以不知道要怎麼修改。
另外有些不知道C語言的格式轉換是怎麼套用到Python的,所以在Python.h的函式不知該怎麼用。
Comments
comments powered by Disqus