簡體   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