前言:
swig可以實作多種進階語言(如python,R,Java等)對C/C++的使用,提供一種轉換的接口.這裡由于項目的需要,介紹下Python對C++的支援.(本文部分參考其它網絡文章,但代碼均經過驗證可行)
安裝SWIG(ubuntu 14.04):
1.安裝pcre(pcre提供對正規表達式的支援)
sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
可能還需要安裝:
sudo apt-get install openssl libssl-dev
2.安裝SWIG:
sudo apt-get install swig
安裝結束
簡單使用
1.用c++語言編寫頭檔案和源檔案為:
頭檔案example.h:
int fact(int n);
源檔案example.cpp:
#include "example.h"
int fact(int n){
if(n<0){
return 0;
}
if(n==0){
return 1;
}
else{
return (1+n)*fact(n-1);
}
}
2.寫swig子產品寫一個檔案example.i:
%module example
%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}
int fact(int n);
3.使用swig生産cxx檔案,建python子產品:
swig -c++ -python example.i
執行完指令後會生成兩個不同的檔案:example_wrap.cxx和example.py.
4.最後一步,利用python自帶工具distutils生成動态庫:
python自帶一個distutils工具,可以用它來建立python的擴充子產品.
要使用它,必須先定義一個配置檔案,通常是命名為setup.py
"""
setup.py
"""
from distutils.core import setup, Extension
example_module = Extension('_example',
sources=['example_wrap.cxx','example.cpp'],
)
setup (name='example',
version='0.1',
author="SWIG Docs",
description="""Simple swig example from docs""",
ext_modules=[example_module],
py_modules=["example"],
)
注意:頭檔案和源檔案都是example.*,那麼setup.py腳本中Extension的參數必須為"_example"
5.編譯
python setup.py build_ext --inplace
6.測試
python指令行:
>>>import example
>>>example.fact(4)
24
>>>
*7.支援STL
*7.1. vector
%module example
%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}
%include stl.i
namespace std{
%template(VectorOfString) vector;
}
int fact(int n);
std::vector<:string> getname(int n);
*7.2. vector >
%module example
%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}
%include stl.i
namespace std{
%template(stringvector) vector;
%template(stringmat) vector >;
}
int fact(int n);
std::vector<:vector> > getname(int n);
*7.3. vector >二維vector(多元vector定義+struct)
%module example
%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}
%include stl.i
struct point
{
int i;
int j;
};
namespace std{
%template(stringvector) std::vector;
%template(stringmat) std::vector<:vector> >;
}
std::vector<:vector> > getname(int n);