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(&ltime);
     return ctime(&ltime);
 }

给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库