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  |