关键字: swig python c/c++
官网为
www.swig.org
可以自动把c/c++封装成python,php,java,.net,perl,tcl等等
最近一直在用C/C++做开发,虽然C/C++都有自己的单元测试框架(CUnit,CPPUnit,知道还有其它框架的兄弟告诉我一声,我去看看),但是总觉得写起来麻烦(人懒没办法),于是萌发了寻找更简便方法的念头。
听说Python, Perl, Tcl都可以调用C的动态链接库,但必须把它们做成这些脚本语言的扩展模块,这样一来,复杂度又变高了,工作量也大。
后来花了一个下午的时间在往上找,终于在一个论坛上发现一个叫SWIG的东西,它将C代码做成各种脚本语言的扩展模块(Python,Perl,Tcl等)。SWIG本质上是一个编译器,它可以通过C/C++的头文件或者一个特殊的接口文件来生成一个以_wrap.c为后缀的包装文件,例如你的C模块叫 test.c, 那么SWIG会为你生成一个test_wrap.c文件,然后将这两个文件编译成一个动态链接库,就能使用其它的脚本语言来调用。下面是个简单的例子
tt.h
#ifdef _WIN32
int __declspec(dllexport)getvalue();
#else
int getvalue();
#endif
tt.c
#include "tt.h"
int getvalue()
{
return 100;
}
下面使用swig和gcc来生成Python模块
环境:mingw32 + msys
swig -python -module tt tt.h
gcc -c tt.c tt_wrap.c -I/usr/local/python25/include
gcc -shared tt.o tt_wrap.o -o tt.dll -L/usr/local/python25/libs -lpython25
tt_test_win.py:
from ctypes import *
tt = CDLL("tt.dll")
print tt.getvalue()
环境:debian
swig -python -module tt tt.h
gcc -c tt.c tt_wrap.c -I/usr/local/include/python2.5
gcc -shared tt.o tt_wrap.o -o tt.so -L/usr/local/lib/python2.5 -lpython2.5
tt_test_linux.py:
from ctypes import *
tt = CDLL("./tt.so")
print tt.getvalue()
在以上两个不同的环境下除了一些include和lib的路径不同以及动态连接库的扩展名不同外,代码基本都差不多。这样swig就将从C映射到Python等脚本语言的工作完成了,我接下来所做的就是使用Python来测试我用C所写的程序。我想这样应该可以大大减少我写测试代码的时间了。
来自:http://blog.163.com/iloveecho83@126/blog/static/17299752520112195752582/