码迷,mamicode.com
首页 > 其他好文 > 详细

SWIG 的应用(一)

时间:2018-03-15 22:18:51      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:gpo   head   ace   ack   /usr   swig   应用   clu   接口   

用 C/C++ 扩展 Python。

- 如果仅使用标准 C 库函数,则可以使用 Python 自带的 ctypes 模块,或者使用 cffi。

- 如果要使用自定义 C/C++ 函数,又不怕写 wrapper 麻烦,则可以使用 Python C API。

- 如果专门针对 C++ 模块打包,可以尝试使用 Boost。

除此之外,可以尝试一下 SWIG 打包 C/C++,以下是一个开始。

 

1) 自己编写接口文件 *.i

要打包的 C 代码 firstSwig.c

/* File: first swig, c file. */

double my_ver = 0.1;

// factorial
int fact(int n) {
    if (n <= 1)
        return 1;
    else
        return n * fact(n-1);
}

// mod
int mod(int m, int n) {
    return m % n;
}

定义接口文件 firstSwig.i

/* swig interface file */

%module firstSwig

%{
// Put headers and other declarations here
extern double my_ver;
extern int    fact(int);
extern int    mod(int, int);
%}

extern double my_ver;
extern int    fact(int);
extern int    mod(int, int);

swig 命令生成 wrapper 文件 firstSwig_wrap.c 和 Python 模块文件 firstSwig.py

$ swig -python firstSwig.i

gcc 编译生成目标文件 firstSwig.ofirstSwig_wrap.o

$ gcc -c -fpic firstSwig.c firstSwig_wrap.c -I /usr/include/python2.7/

gcc 链接目标文件为动态链接库 _firstSwig.so

$ gcc -shared firstSwig.o firstSwig_wrap.o -o _firstSwig.so

然后将 firstSwig.py_firstSwig.so 一起发布即可。

 

2) 不编写接口文件 *.i,而是直接用头文件 *.h  (注意这种情况下,不支持变量的打包)

要打包的 C 代码 firstSwig.c

/* File: first swig, c file. */

// factorial
int fact(int n) {
    if (n <= 1)
        return 1;
    else
        return n * fact(n-1);
}

// mod
int mod(int m, int n) {
    return m % n;
}

对应 C 代码的头文件 firstSwig.h

/* File: first swig, header file. */

// factorial
int fact(int n);

// mod
int mod(int m, int n);

swig 直接使用头文件生成 wrapper 文件 firstSwig_wrap.c 和 Python 模块文件 firstSwig.py

$ swig -python -module firstSwig firstSwig.h

其余步骤和方法 1) 一致,

gcc 编译生成目标文件 firstSwig.ofirstSwig_wrap.o

$ gcc -c -fpic firstSwig.c firstSwig_wrap.c -I /usr/include/python2.7/

gcc 链接目标文件为动态链接库 _firstSwig.so

$ gcc -shared firstSwig.o firstSwig_wrap.o -o _firstSwig.so

然后将 firstSwig.py_firstSwig.so 一起发布即可。

 

完。

 

SWIG 的应用(一)

标签:gpo   head   ace   ack   /usr   swig   应用   clu   接口   

原文地址:https://www.cnblogs.com/gaowengang/p/8576310.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!