SWIG是一个接口编译器,为c/c++提供脚本语言接口,支持多种语言(Perl, PHP, Python, Tcl, Ruby 和 PHP)
安装
#linux
apt-get install swig
命令步骤
#根据example.cpp编写接口文件example.i(见下文相关代码)
#swig会通过example.i对c++代码进行封装,生成example.py,example_wrap.cxx
swig -c++ -python example.i
#编译生成动态库
g++ -fpic -c example.cpp
g++ -fpic -I/usr/include/python2.6 -c example_wrap.cxx
g++ -shared example_wrap.o -o example.so
也有部分教程在swig生成example_wrap.cxx和example.py文件后,利用distutils生成动态库,可参考:https://blog.csdn/u013378306/article/details/70172076
知识点补充:
.cpp文件:g++(gnu的c++编译器)
.c文件:gcc(gnu的c编译器)
[相关参数详解]
-c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
-share 生成共享目标文件。通常用在建立共享库时。
-o FILE 生成指定的输出文件。用在生成可执行文件时。
-fPIC 生成位置无关目标代码,适用于动态连接
gnu更多参考:https://wwwblogs/942267027wzmblog/p/6150218.html
相关代码
官网的例子是c的,学习思想为主
/*官网例子*/
/* File : example.c */
#include <time.h>
double My_variable = 3.0;
int fact(int n) {
if (n <= 1) return 1;
else return n*fact(n-1);
}
int my_mod(int x, int y) {
return (x%y);
}
char *get_time()
{
time_t ltime;
time(<ime);
return ctime(<ime);
}
给swig写一个接口文件:example.i,定义接口
编写规则:
- 首先在 %module 后面声明模块名称,这就是Python在import时使用的模块名称;
- 在%{ … %}之间一般包含此文件需要的一些函数声明和头文件。
- 在%include 后面可以声明对STL的支持
- 最后声明要封装的函数和变量,也可以直接包含头文件: %include “trie.h”
/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
/*include "time.h"*/
%}
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
/*include "time.h"*/
参考:
swig官网
http://www.swig/tutorial.html
学习笔记:安装swig+用SWIG封装C++为Python模块+SWIG使用说明
https://wwwblogs/amiza/p/10340846.html
SWIG实现Python封装调用C/C++代码
http://cering.github.io/2015/12/08/%E4%BD%BF%E7%94%A8SWIG%E5%AE%9E%E7%8E%B0Python%E8%B0%83%E7%94%A8C-C-%E4%BB%A3%E7%A0%81/
利用 SWIG 对 C++ 库进行 Python 包装(强力表白!入门看懂真的是靠这篇文章)
https://segmentfault/a/1190000013219667
更多推荐
python/c++ SWIG把c++封装成为python可调用的so库
发布评论