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

未解析的外部符号在共享C库中使用swig构建python C扩展,python,c,swig,Python,C,Swig,我正在尝试使用SWIG为python包装一个C库。我在一个使用标准系统工具链的linux 64位系统(Gentoo)上。库(日晷)安装在我的系统上,共享库位于/usr/local/lib 我的接口文件很简单(首先) 给定上面的接口文件,我运行 $ swig -python -I/usr/local/include nvecserial.i $ gcc -O2 -fPIC -I/usr/include/python2.7 -c nvecserial_wrap.c $ gcc -shared /u

我正在尝试使用SWIG为python包装一个C库。我在一个使用标准系统工具链的linux 64位系统(Gentoo)上。库(日晷)安装在我的系统上,共享库位于
/usr/local/lib

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

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

$ 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
据我所知,N_VLinearSum是N_VLinearSum_Serial的包装器(也有一个并行实现,所以可以推测,nvecparallel中的N_VLinearSum将N_VLinearSum_parallel包装)。但我迷路的是下一步该怎么办。这是接口定义的问题还是编译的问题?

而不是

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


-l应该在末尾,否则可能无法在lib中搜索符号。ld手册页对此进行了解释

我们将通过在一个额外的库中链接使其工作。它似乎是《日晷》杂志的一个系列。所以《日晷》和《兄弟》不包含符号N\u VLinearSum。Sundails make进程将函数和符号从
Sundails\u invector.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源代码,我可能会坚持使用额外共享库中的链接。

谢谢,我尝试过,但我还是得到了同样的结果。链接没有失败,至少没有错误消息。@sirlark可能是因为我的顺序错了,现在试试。谢谢,我也尝试了新的顺序,但也没有骰子。如果我查看objdump输出,N_VLinearSum在链接的两个库中都是UND(未定义?未声明?)。除了,看看Sundail_Invector.c的.c源代码,它是完全定义的(不是外部的,也不是正向引用或任何东西)。只是为了再次检查,我用“错误”的顺序再次尝试了链接,即
gcc-shared-L/usr/local/lib-lsundals\u invecserial-lsundals\u cvode invecserial\u wrap.o-o-invecserial.so
。它起作用了,所以@Scholli的建议不是问题,但还是要谢谢你。
gcc -shared /usr/local/lib/libsundials_nvecserial.so nvecserial_wrap.o -o _nvecserial.so
gcc -shared -L/usr/local/lib nvecserial_wrap.o -o _nvecserial.so -lsundials_nvecserial
$ gcc -shared -L/usr/local/lib nvecserial_wrap.o -o _nvecserial.so\
-lsundials_nvecserial -lsundials_cvode
$ python -c "import nvecserial"
$