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即可调用。
使用方法