未解析的外部符号使用swig针对共享C库构建python C扩展

2024-10-03 19:21:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用SWIG为python包装一个C库。我使用的是使用标准系统工具链的linux 64位系统(Gentoo)。库(sundalials)安装在我的系统上,共享库位于/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"

给定上面的接口文件,我运行

^{pr2}$

再仔细检查一下

$ 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)。我迷路的地方是下一步要做的。这是接口定义的问题,还是编译的问题?在


Tags: 文件textconfigincludelibusrlocal系统
2条回答

而不是

gcc -shared /usr/local/lib/libsundials_nvecserial.so nvecserial_wrap.o -o _nvecserial.so

试试看

^{pr2}$

l应该在末尾,否则可能无法搜索库中的符号。这在ld手册页中有解释。在

我们可以在图书馆里工作。似乎libsundials_nvecserial.so和brothers不包含符号N\u VLinearSum。日晷使process将sundials_nvector.h中的函数和符号放入不同的.so文件中,这有点违反直觉。在

现在,我用这个

$ gcc -shared -L/usr/local/lib nvecserial_wrap.o -o _nvecserial.so\
-lsundials_nvecserial -lsundials_cvode
$ python -c "import nvecserial"
$

我将继续使用源代码发行版中的实际.o文件,但考虑到最终使用distutils分发包装好的模块的意图,而且并不是每个人都可以访问其系统上的sundalials源代码,我可能会坚持在额外的共享库中进行链接。在

相关问题 更多 >