zoukankan      html  css  js  c++  java
  • python 中用SWIG包装C和C++和接口生成的例子

    SWIG是简单包装和接口生成器的缩写,它是一个能用于用于集中语言的工具。一方面,可以通过它使用C语言或者C++编写扩展代码;另一方面,它会自动包装那些代码,以便能在一些高级语言中使用,例如Tcl Python Perl Ruby java. 这就意味着如果决定将系统的一部分使用C语言扩展编写,而不是直接在Python中实现的话,那么C语言扩展库也能在其他语言中使用。当然需要一些不同语言编写的子系统协同工作时,这一点就非常有用。C语言扩展在协同工作时会变得很重要。

     

    first step:

    一个简单的C语言程序:

    hello.c

    #include <stdio.h>

    #include <string.h>

    int say_hello(void)

    {

    printf("Hello world!!");

    return 0;

    }

     

    second step:

    编写接口文件: 接口描述放到文件hello.i中。在很多情况下,如果定义了头文件,SWIG就可以从头文件中得到需要的信息。因此如果拥有一个头文件,可以随意的使用它。显示的描写一个接口文件是因为可以知道SWIG是怎么包装代码的。最重要的是排除一些东西。比如,如果你要包装一个巨大的C语音库,可能需要导出一些function到Python中。在这种情况下,只要把需要导出的函数放到接口文件中就可以了。

    接口文件中,就像在一个头文件中那样,只需要声明要导出的函数和变量。头部的一个单元内,可以指定包含的头文件以及在这之前的一个%module声明,即为模块定义一个名字。

     

    hello.i

    %module hello

     

    %{

    #include<string.h>

    #include<stdio.h>

    %}

     

    extern int say_hello(void);

     

    third step:

    输入:swig -python hello.i

    得到两个新文件:hello_wrap.c 和hello.py

     

    forth step: 编译、链接以及使用

    编译可能是最有技巧的,为了正确的编译代码,需要知道python分布版的源代码放在哪。还要根据选择的C语言编译器,将代码链接到一个共享库,指明正确的选项。

    我用的是Ubuntu 10.10的系统

    eg.

    gcc -c hello.c

    gcc -I/usr/include/python2.6 -c hello_wrap.c  #根据python不同的版本自己选择文件夹

    gcc -shared hello.o hello_wrap.o -o _hello.so

     

    然后打开python

    >>> import _hello

    >>> dir(_hello)

    ['SWIG_PyInstanceMethod_New', '__doc__', '__file__', '__name__', '__package__', 'say_hello']

    >>>_hello.say_hello()

    Hello World!!0

     

    以上完毕。这个就是用SWIG来封装C语言。

  • 相关阅读:
    第五章
    大道至简第一章。原因:之前第一章发表成文章了,无法显示在主页
    字符加密
    String类的使用说明
    String.equals()
    大道至简第四章
    使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。
    Java——Random类随机整数---18.10.11
    Java——英文字母---18.10.11
    Java——自动生成30道四则运算---18.09.27
  • 原文地址:https://www.cnblogs.com/nickchan/p/3104510.html
Copyright © 2011-2022 走看看