【发布时间】:2014-07-17 13:16:47
【问题描述】:
我正在尝试使用 SWIG 为 python 包装一个 C 库。我在使用标准系统工具链的 linux 64 位系统(Gentoo)上。该库(SUNDIALS)安装在我的系统上,共享库位于/usr/local/lib
我的接口文件很简单(开始)
%module nvecserial
%{
#include "sundials/sundials_config.h"
#include "sundials/sundials_types.h"
#include "sundials/sundials_nvector.h"
#include "nvector/nvector_serial.h"
%}
%include "sundials/sundials_config.h"
%include "sundials/sundials_types.h"
%include "sundials/sundials_nvector.h"
%include "nvector/nvector_serial.h"
给定上面的接口文件,我运行
$ swig -python -I/usr/local/include nvecserial.i
$ gcc -O2 -fPIC -I/usr/include/python2.7 -c nvecserial_wrap.c
$ gcc -shared /usr/local/lib/libsundials_nvecserial.so nvecserial_wrap.o -o _nvecserial.so
$ python -c "import nvecserial"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "nvecserial.py", line 28, in <module>
_nvecserial = swig_import_helper()
File "nvecserial.py", line 24, in swig_import_helper
_mod = imp.load_module('_nvecserial', fp, pathname, description)
ImportError: ./_nvecserial.so: undefined symbol: N_VLinearSum
稍微挖掘以仔细检查显示
$ objdump -t /usr/local/lib/libsundials_nvecserial.so |grep Linear
0000000000001cf0 g F .text 00000000000002e4 N_VLinearSum_Serial
$ objdump -t _nvecserial.so |grep Linear
00000000000097e0 l F .text 0000000000000234 _wrap_N_VLinearSum
000000000000cd10 l F .text 0000000000000234 _wrap_N_VLinearSum_Serial
0000000000000000 *UND* 0000000000000000 N_VLinearSum
0000000000000000 F *UND* 0000000000000000 N_VLinearSum_Serial
据我所知,N_VLinearSum 是围绕 N_VLinearSum_Serial 的包装器(也有并行实现,因此推测 nvecparallel 中的 N_VLinearSum 将包装 N_VLinearSum_Parallel)。我迷路的地方是下一步该做什么。这是我的接口定义有问题,还是我的编译有问题?
【问题讨论】: