gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:31:26 29 4
gpt4 key购买 nike

我正在尝试使用 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"

鉴于上面的接口(interface)文件,我运行

$ 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)。但我迷失的是下一步该做什么。这是我的接口(interface)定义的问题,还是我的编译的问题?

最佳答案

我们将通过链接额外的库来使其工作。看来 libsundials_nvecserial.so 和 brethren 不包含符号 N_VLinearSum。 SUNDIALS make 进程将来自 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 分发包装模块的意图,并且并非每个人都可以访问其系统上的 SUNDIALS 源代码,我将可能会坚持在额外的共享库中进行链接。

关于python - 使用 swig 针对共享 C 库构建 python C 扩展时未解析的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24804667/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com