加载中…
个人资料
老徐
老徐
  • 博客等级:
  • 博客积分:0
  • 博客访问:828,517
  • 关注人气:156
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

SWIG:Simple Wrapper and Interface Generator

(2012-07-03 15:07:28)
标签:

swig

c/c

tcl

interface

杂谈

分类: C/CPlusPlus
可能大家不是很熟悉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 **argv)
{
         int i, j;
         double res=1.0;
         char re[30];
         if (argc 2)
         {
                 Tcl_AppendResult(interp, "wrong args: should be myfract num", (char *)NULL);
                 return TCL_ERROR;
         }
         if (Tcl_GetInt(interp, argv[1], &i) != TCL_OK)
         {
                 return TCL_ERROR;
         }
         for (j=1;j<=i;j++)
                 res *= j;
         sprintf(re,"%le",res);
         Tcl_SetResult(interp, re, TCL_VOLATILE);
         return TCL_OK;
}

int Fract_Init(Tcl_Interp *Interp) {
         Tcl_CreateCommand (Interp, "myfract", Tcl_myfract, (ClientData)NULL,(void (*)())NULL);
         return TCL_OK;
}

(2)运行以下命令:
gcc -c fract.c
gcc -shared -o fract.so fract.o
生成fract.so动态连接库

(3)在tcl程序中加上"load ./fract.so"一句话,就可以用myfract命令了.

这种做法可以实现Tcl/Tk的任意扩充,功能强大,但实在是太麻烦了.而且,
如果又想扩充Perl,Python等,那又得用它们的接口重写一遍.
swig可以提供比较方便的统一扩充接口,而不需要对各种语言的特点有所
了解,所以在很多情况下很适合使用.

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有