2012-10-08 74 views
0

我想在Python中的MDB庫接口,使用痛飲生成基於隨MDB頭文件綁定時。這是我第一次嘗試這樣做,並且最終在python中加載共享庫時,我被一個未定義的符號卡住了。未定義的符號產生的Python SWIG綁定的C庫

這是我的接口定義文件:

$ 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 multiarch):

$ ld -shared -lmdb pymdb.o -o _pymdb.so 

而這正是我得到未定義的符號,在蟒蛇裝載的.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和鏈接的東西,所以我現在在如何着手解決這個問題方面有點失落。

+0

快速猜測:鏈接修復事件時是否改變參數的順序?如果是這樣,請參閱http://stackoverflow.com/questions/8140494/why-am-i-getting-a-gcc-undefined-reference-error-trying-to-create-shared-objec/8140599#8140599。 – Flexo

回答

0

在可能性是一個功能是在頭文件中聲明,但在對象文件未被定義。這在C中可以很好地工作,在非引用聲明中不存在問題,但是當swig包裝聲明時,它將創建一個引用,從而導致共享庫無法加載。