簡體   English   中英

未定義符號:使用 numpy 和 swig 時的 PyArray_API

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM