准备好需要的文件
- demo.h、libdemo.so(研发提供的api .h文件和动态库)
- demo.i(自己编写的swig封装说明文件)
通过SWIG进行封装
- swig根据demo.i生成demo_wrap.cxx和demo.py两个文件
swig -c++ -python demo.i
2.将上一步产生的demo_wrap.cxx编译为demo_wrap.o文件
g++ -O2 -fPIC -c demo_wrap.cxx -I/usr/local/python3/include/python3.7m/
备注:-I后是python3头文件–Python.h所在路径,如果使用python2,需替换成对应python2头文件的路径。
- 将.cpp文件编译成.so文件
(如果有.so文件则此步骤不用,直接进行第4步)
g++ -fpic -shared -o libdemo.so demo.cpp
- 将demo_wrap.o再进行编译,并与动态库libdemo.so进行链接,生成可以被python调用的_demo.so
g++ -shared demo_wrap.o -L./ -ldemo -Xlinker -rpath /home/longzhen/1120 -o _demo.so
备注:-rpath后面的参数是libdemo.so所在路径;最后’demo’与.i文件名相同
验证
到这里封装工作已经完成, python直接导入demo模块就可以使用
import demo
调用里面的函数,例如add(),方法为demo.add()
关于.i文件的说明
1、可以把所有类和函数的声明放到.h文件里,还是以dem.h为例,那么.i只需要这样编写,就可以实现文件里所有类和函数的封装。
%module demo
%{
#include "demo.h"
%}
%include "demo.h"
2、如果函数参数为指针和数组的话,1中的写法就不满足了,还需要在.i里加上下面的内容
%include "cpointer.i"
%pointer_functions(int,intp); //针对指针
%include "carrays.i"
%array_functions(int, intArray); //针对数组
详细参考 https://blog.csdn.net/SangoHan77/article/details/79164204
对象作为参数的例子 https://www.xuebuyuan.com/2057564.html