繁体   English   中英

为C库生成Python SWIG绑定时的未定义符号

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM