swig-c打包成python包

2023/8/30更新:可能遇到的问题

/lib64/libc.so.6: version `GLIBC_2.14’ not found (required by /tmp/_MEIFMzni8/libz.so.1)

也可能报错:

[23217] Error loading Python lib '/tmp/_MEIrdY8qj/libpython3.6m.so.1.0': dlopen: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by /tmp/_MEIrdY8qj/libpython3.6m.so.1.0)

这是因为,我是在另一个更新的linux环境下打包的,挪到老环境就不能用了。解决办法是重新打包。

检查GLIBC的版本:

strings /lib64/libc.so.6 | grep GLIBC

发现最高只到2.12。因为我这个系统装包不方便,所以我放弃了。

找不到<Python.h>

参考网上的解法,因为我本机python是3.8.5,所以我安装了python3.8-dev

root@551c5xx794:/swig# apt-get install python3.8-dev

但是仍然报错。

最后发现是编译的时候头文件的包含路径写错了。下面是实例的命令,其中-I后面跟头文件的路径,就是Python.h所在的路径。
除了/usr/local/include/python3.6m还可以检查一下/usr/include/python3.8。

swig -python example.i
gcc -c -fpic example.c example_wrap.c -I /usr/local/include/python3.6m
gcc -shared example.o example_wrap.o -o _example.so

在这里插入图片描述


swig:Simplified Wrapper and Interface Generator
swig本质是代码生成器,为c/c++程序生成到其他语言的包装代码wrapper code,这些包装代码会利用各语言提供的c API,将C/C++中的内容暴露给相应语言。SWIG需要一个接口描述文件,包含:ANSI C函数原型声明;ANSI C变量声明;SWIG指示器(directive)相关内容。SWIG可以直接接受.h头文件作为接口描述文件,生成包装代码后,编译链接即可变成可被调用的库。
版本:3.0.0起支持c++11和c++嵌套类,4.0.0支持Doxygen(注释变文档的工具)

安装

官网下载源码包swig-4.0.1.tar.gz,放在/home/yourname/app/
tar zxvf *gz
进入文件夹
./configure
make
make install
默认装到了/usr/local/share下,如果需要指定路径,应在configure时:
./configure --prefix=/home/yourname/projects

实例

example.c

double My_variable = 3.0;

int fact(int n) {
 if (n <= 1)
  return 1;
 else
  return n*fact(n-1);
}
int my_mod(int n, int m) {
 return (n % m);
}

swig接口文件,example.i

%module example
%{
/* put headers and other declarations here */
extern double My_variable;
extern int fact(int);
extern int my_mod(int n, int m);
%}
extern double My_variable;
extern int fact(int);
extern int my_mod(int n, int m);

生成

swig -python example.i
gcc -c -fpic example.c example_wrap.c -I /usr/local/include/python3.6m
gcc -shared example.o example_wrap.o -o _example.so

会产生如下文件。保留.so和.py即可调用。
在这里插入图片描述
使用方法
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值