|
|
|
|
|
| |
| 可能大家不是很熟悉swig这个名字,它的全称是Simple Wrapper and Interface Generator.它是干什么用的呢?是用来把C语言子程序包装成一些脚本语言的命令用的.比如,不少人喜欢使用Tcl/Tk来写点界面,但Tcl/Tk的数学功能实在太差,有时候就想自己给它扩充一些数学函数.又比如说,用Perl写个CGI程序,想用一个已经现成的自己编好的C语言子程序来处理用户返回的数据.这时候就用得上swig了.
其实刚才举的那些脚本语言都有自己的扩充接口,比如Perl有XS格式,Tcl/Tk有一套扩充内核用的C语言函数库.例如,要给Tcl扩充一个myfract命令,用来实现阶乘,可以这样做: (1)写一个C语言程序,假设叫做fract.c,内容如下: #include "tcl.h" int Tcl_myfract(ClientData notUsed, Tcl_Interp *interp, int argc,
char int Fract_Init(Tcl_Interp *Interp) { (2)运行以下命令: (3)在tcl程序中加上"load ./fract.so"一句话,就可以用myfract命令了. 这种做法可以实现Tcl/Tk的任意扩充,功能强大,但实在是太麻烦了.而且,如果又想扩充Perl,Python等,那又得用它们的接口重写一遍.swig可以提供比较方便的统一扩充接口,而不需要对各种语言的特点有所了解,所以在很多情况下很适合使用. 下面我们看看swig怎样完成刚才的工作. (1)写一个C语言函数提供阶乘功能,例如写一个fract.c,内容为: double myfract(int n) (2)写一个通用接口文件,后缀为.i,例如fract.i,内容为: %module myfract 第一句的意思是生成的模块叫myfract,第二句就是按C语言格式声明要输出的函数,加上一个extern. (3)运行swig -tcl fract.i,生成fract_wrap.c和fract_wrap.doc(自动生成的文档) (4)运行 gcc -c fract.c fract_wrap.c (5)在Tcl程序中加上"load ./myfract.so"即可. 显然比刚才的办法好懂多了. 如果要生成的是Perl模块,那么第三步改成"swig -perl fract.i",这时还会生成一个myfract.pm文件.运行第四步时,前一个命令要改成: gcc -c fract.c fract_wrap.c -I/usr/lib/perl5/i586-linux/5.00404/CORE/ -Dbool=char 其中的路径是perl.h所在的目录,每台机器可能不一样.最后在Perl程序中加上"use myfract"即可. swig的功能其实很强大,它可以分析C/C++源程序,可以生成HTML/LaTex/text文档,等等.大家可以看它的文档(很多的pdf文件).就说这些. | |
来源: 中国科大BBS站 [bbs.ustc.edu.cn] http://202.38.75.11/~hwang/ | |
|
|
| ©Tcl/Tk中文网 2003-2008 |
|
|