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.net/u013378306/article/details/70172076
知識點補充:
.cpp文件:g++(gnu的c++編譯器)
.c文件:gcc(gnu的c編譯器)
[相關參數詳解]
-c 只激活預處理,編譯,和彙編,也就是他只把程序做成obj文件
-share 生成共享目標文件。通常用在建立共享庫時。
-o FILE 生成指定的輸出文件。用在生成可執行文件時。
-fPIC 生成位置無關目標代碼,適用於動態連接
gnu更多參考:https://www.cnblogs.com/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.org/tutorial.html
學習筆記:安裝swig+用SWIG封裝C++爲Python模塊+SWIG使用說明
https://www.cnblogs.com/amiza/p/10340846.html
SWIG實現Python封裝調用C/C++代碼
http://cering.github.io/2015/12/08/使用SWIG實現Python調用C-C-代碼/
利用 SWIG 對 C++ 庫進行 Python 包裝(強力表白!入門看懂真的是靠這篇文章)
https://segmentfault.com/a/1190000013219667