1.介绍
SWIG将C代码做成各种脚本语言的扩展模块(Python,Perl,Tcl等。SWIG本质上是一个编译器,它可以通过C/C++的头文件或者一个特殊的接口文件来生成一个以_wrapc为后缀的包装文件,例如你的C模块叫 test.c, 那么SWIG会为你生成一个test_wrapc文件,然后将这两个文件编译成一个动态链接库,就能使用其它的脚本语言来调用。
2.环境配置
python 2.7 + SWIG 2.0.12
3.Demo
1)下载并安装SWIG 2.0.12版本(http://swig.org/), Python 2.7 版本.
并将C:\swigwin-2.0.12, c:\Python27 添加到环境变量Path中。
2)代码:
foo.h:
extern void hello(void);
foo.c:
#include <stdio.h>
#include "foo.h"
void hello(void)
{
printf("Hello world!\n");
}
foo.i:
%module foo
%include "foo.h"
3)编译:
step 1: 调用swig生成wrapper, foo_wrap.c和foo.py(swig -python foo.i)
step 2: 使用vc的编译器进行编译目标文件。
打开VS -> Tools -> Visual Studio 2005 Command Prompt,定位到foo.c所在目录。
cl /Fe_foo.pyd /LD foo.c foo_wrap.c c:\Python27\libs\python27.lib /Ic:\Python27\include
生成的foo.py和_foo.pyd择其一即可正常调用。
step 3: 在当前目录下运行python命令行进行测试。
>> import foo
>> foo.hello()
4.注意事项
对于将要打包的C/C++代码,只有.h和.i文件时不够的,必须有.c/.cpp源代码,也就是说对于非自己生成的DLL库,是不能直接通过头文件生成.pyd库的。(但是我们可以加一层调用,这样的话就可以,但是通用性比较成问题,当外部DLL库导出符号发生变化的时候,中间层必须同时变化,维护是一场灾难。)
参见文章: http://blog.csdn.net/chishui2/article/details/2254961