試圖解決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