首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未解析的外部符号在共享C库上构建带有swig的python C扩展

未解析的外部符号在共享C库上构建带有swig的python C扩展
EN

Stack Overflow用户
提问于 2014-07-17 13:16:47
回答 2查看 852关注 0票数 0

我正在尝试用SWIG包装用于python的C库。我在使用标准系统工具链的linux 64位系统(Gentoo)上。这个库(太阳刻度盘)安装在我的系统上,在/usr/local/lib中使用共享库

我的接口文件很简单(首先)

代码语言:javascript
复制
%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"

考虑到上面的接口文件,我运行

代码语言:javascript
复制
$ 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

再仔细查一遍

代码语言:javascript
复制
$ 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)。但我迷失的地方是下一步该做什么。这是我的接口定义中的问题,还是我的编译方面的问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-18 08:13:35

我们会把它连接到一个额外的库里。libsundials_nvecserial.so和兄弟们似乎不包含符号N_VLinearSum。日晷将sundials_nvector.h中的处理函数和符号放入不同的.so文件中,这与直觉有些相反。

就目前而言,我的工作是

代码语言:javascript
复制
$ gcc -shared -L/usr/local/lib nvecserial_wrap.o -o _nvecserial.so\
-lsundials_nvecserial -lsundials_cvode
$ python -c "import nvecserial"
$

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

票数 1
EN

Stack Overflow用户

发布于 2014-07-17 23:24:22

而不是

代码语言:javascript
复制
gcc -shared /usr/local/lib/libsundials_nvecserial.so nvecserial_wrap.o -o _nvecserial.so

试一试

代码语言:javascript
复制
gcc -shared -L/usr/local/lib nvecserial_wrap.o -o _nvecserial.so -lsundials_nvecserial

-l应该结束,否则库可能不会被搜索到符号。在ld手册页中对此进行了解释。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24804667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档