[英]Undefined symbol when generating Python SWIG binding for C library
我正在尝试与Python中的mdb库交互,使用SWIG基于mdb附带的头文件生成绑定。 这是我的第一次尝试,最终在python中加载共享库时,我陷入了未定义符号的困境。
这是我的界面定义文件:
$ cat pymdb.i
%module pymdb
%{
#include "mdbtools.h"
%}
%include "mdbtools.h"
生成C代码会引发以下警告:
$ swig -python -o pymdb.c -I/usr/include pymdb.i
/usr/include/mdbtools.h:187: Warning 451: Setting a const char * variable may leak memory.
/usr/include/mdbtools.h:188: Warning 451: Setting a const char * variable may leak memory.
/usr/include/mdbtools.h:189: Warning 451: Setting a const char * variable may leak memory.
/usr/include/mdbtools.h:190: Warning 451: Setting a const char * variable may leak memory.
/usr/include/mdbtools.h:191: Warning 451: Setting a const char * variable may leak memory.
/usr/include/mdbtools.h:192: Warning 451: Setting a const char * variable may leak memory.
/usr/include/mdbtools.h:193: Warning 451: Setting a const char * variable may leak memory.
编译C代码,一切看起来都很好:
$ gcc -c -fPIC -I/usr/include/python2.7 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include pymdb.c -o pymdb.o
将其链接到/usr/lib/x86_64-linux-gnu/libmdb.so.2.0.0文件(Debian多体系结构):
$ ld -shared -lmdb pymdb.o -o _pymdb.so
这是我得到未定义符号的地方,在python中加载.so:
$ echo "import pymdb" |python
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pymdb.py", line 26, in <module>
_pymdb = swig_import_helper()
File "pymdb.py", line 22, in swig_import_helper
_mod = imp.load_module('_pymdb', fp, pathname, description)
ImportError: ./_pymdb.so: undefined symbol: read_pg_if_16
mdbtools.h中有一个read_pg_if_16的声明:
extern guint16 read_pg_if_16(MdbHandle *mdb, int *cur_pos);
我可以在_pymdb.so文件表中看到未定义的符号:
$ objdump -T _pymdb.so |grep read_pg_if_16
0000000000000000 D *UND* 0000000000000000 read_pg_if_16
但是libmdb.so.2不提供以下符号:
$ objdump -T /usr/lib/x86_64-linux-gnu/libmdb.so.2 |grep read_pg_if_16
界面文件中可能有错误吗? 或者这可能是libmdb.so.2的问题,未公开此符号? 我对C和链接方面的知识不那么深入,因此在这一点上,我对如何继续解决这个问题有点迷茫。
有可能是在头文件中声明了一个函数,但未在目标文件中定义一个函数。 这在C中可以正常工作,在C中没有引用的声明不是问题,但是当swig封装声明时,它将创建引用,从而导致不加载共享库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.