SWIG (Simplified Wrapper and Interface Generator) 是一个开源工具,用于让C/C++的程序和库可以被其他语言调用。
支持的非常多语言,有Lua, Perl, PHP, Python, R, Ruby, C#, Java, JavaScript, Go, Scheme 等。
大致流程
- 定义SWIG接口文件
- 生成C/C++和目标语言的包装代码
- 编译位置无关的C/C++包装代码和功能代码,并链接为动态库
c++示例代码
下面用到的C++代码
头文件1
2
3
4
5
6
7
8
9
10
11
12
13/* utils.h */
using namespace std;
class Utils {
public:
Utils();
string Float2String(float Num);
};
具体实现代码1
2
3
4
5
6
7
8
9
10
11
12/* utils.cpp */
Utils::Utils() {}
string Utils::Float2String(float Num)
{
ostringstream oss;
oss<<Num;
string str(oss.str());
return str;
}
SWIG 接口文件
1 | /* example.i */ |
其中%include "std_string.i"
, 实现了c++的string自动转python的str
生成动态库
1 | swig -c++ -python example.i |
注意编译example_wrap.cxx
时引入对应版本的python头文件,不同系统的路径可能有所不同。
使用
1 | import example |