【问题标题】:Cython unable to find C functions and object from external C fileCython 无法从外部 C 文件中找到 C 函数和对象
【发布时间】:2023-03-14 01:05:01
【问题描述】:

现在我正在尝试使用 Cython 将 C 函数加载到 Python 中,类似于此处描述的内容:http://docs.cython.org/src/userguide/external_C_code.html。假设我的 C 文件名为 temp.c,我的 pxd 文件名为 decl.pxd,我的 pyx 文件名为 test.pyx。假设我想从 temp.c 导入一个名为 int my_func(int spam) 的函数:

cdef extern from "temp.c":
 int my_func(int spam)
cdef int my_func(int spam)

然后我将 my_func 导入 test.pyx 并尝试使用它:

from decl cimport my_func

my_func(1)

Cython 编译得很好,但是当我尝试使用 Python shell 导入从 test.pyx 构建的“测试”模块时,它会抛出错误并显示“符号 my_func 无法识别”。此外,当我查看 Cython 编译器生成的 html 文件时,您可以在其中查看为 test.pyx 生成的 C 代码,my_func 的 C 文件中的代码不存在,表明 Cython 必须有找不到my_func

我意识到我没有详细介绍 temp.c 的外观,但是有没有办法可以调试为什么 Cython 显然无法找到 my_func 的源代码?

【问题讨论】:

标签: python cython


【解决方案1】:

http://docs.cython.org/src/userguide/external_C_code.html#implementing-functions-in-c

请注意,它说cdef extern from "spam.c": 应该在 .pyx 中,cdef void order_spam(int tons) 在 .pxd 中。在您的情况下,您已将两者都放入 .pxd 中,这似乎是错误的。文档还声明该函数必须是静态的。

【讨论】:

    【解决方案2】:

    作为后续,我通过将 temp.c 编译成 libtemp.so 解决了这个问题,然后按照此处的说明将 Cython 与 temp.h(此处的头文件)和 libtemp.so 链接:

    Wrap C++ lib with Cython

    【讨论】:

      猜你喜欢
      • 2018-09-27
      • 2014-05-15
      • 2014-02-11
      • 2015-08-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多