1

SWIG を使用して、mdb に同梱されているヘッダー ファイルに基づいてバインディングを生成し、Python で 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 やリンクに関することにはあまり詳しくないので、この問題を解決する方法について、この時点で少し迷っています。

4

1 に答える 1