SWIG把c++封裝成爲python可調用的so庫

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(&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.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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章