[英]undefined symbol: PyArray_API when using numpy and swig
我试图用 Swig 在 Python 中包含一些用 C 编写的代码。 目的是在 Python 中创建 numpy arrays 并在 Z0D61F8370 中将它们用作指向 CAD1D412F5Z22 的指针。
这是代码:
在 Swig 中:
%apply (int DIM1, double* INPLACE_ARRAY1) {(int n, double* x)} extern void f(int n, double* x);
在 C 中:
void f(int n, double* x)
不幸的是,当我尝试加载模块时,我收到以下错误消息:
ImportError: _test.so: undefined symbol: PyArray_API
谢谢!
我们需要更多关于如何构建/链接它的详细信息。 根据可用信息,我最好的猜测是,由于 SWIG 不支持 C(我知道有一个 fork),但您的其他代码是,您将最终模块库与 C 编译器链接,而不是 ZF6F897C9FDCF8EEB3C2F
这是一个基本的工作示例(假设您将 numpy.i 复制到本地目录)。 首先, fun.i
:
%module fun
%{
#include "f.h"
%}
%include "numpy.i"
%init %{
import_array();
%}
%apply (int DIM1, double* INPLACE_ARRAY1) {(int n, double* x)}
extern void f(int n, double* x);
然后fh
:
#include "numpy/arrayobject.h"
extern "C" void f(int n, double* x);
大口喝水:
$ swig -python -c++ fun.i
编译你的 f.c 实现(你没有提供;C 编译器很好),然后链接:
$ g++ -O2 -o _fun.so -shared fun_wrap.cxx f.o `python3-config --includes` -fPIC -I`python -c 'import numpy; print(numpy.get_include())'` -Wno-cpp
并使用:
>>> import fun
>>> import numpy as np
>>> x = np.array(range(10), dtype=np.double)
>>> fun.f(x)
>>>
所以现在,如果我检查nm _fun.so | grep PyArray_API
nm _fun.so | grep PyArray_API
,我得到:
0000000000009740 b _ZL11PyArray_API
所以它在数据部分中,而不是要解析的符号,但请注意,名称已损坏,因此只能由 C++ 解析。
编辑:(如以下评论中所述。)
numpy 的 _multiarray_umath 子模块中有一个强大的 PyArray_API 数据符号(无论如何在我的系统上)。 我不认为以下是解决方案,但它可能有助于找出问题所在,原则上,“import_array”部分应该处理相同的问题。
比较这个结果:
>>> import numpy
>>> import fun # the SWIG module, test in your case I think
与此相比:
>>> import numpy.core._multiarray_umath as um
>>> import ctypes
>>> h = ctypes.CDLL(um.__file__, ctypes.RTLD_GLOBAL)
>>> import fun # or import test if that's the name
这可能表明它对我有用而不对你有用的原因是由于我们各自的 numpy 安装的差异。 (两者都为我工作。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.