将 C 库与 Cython 一起使用时出现错误

Posted

技术标签:

【中文标题】将 C 库与 Cython 一起使用时出现错误【英文标题】:I get an error, when using C-library with Cython 【发布时间】:2019-11-13 12:17:33 【问题描述】:

在 Qt Creator 中,我创建了一个小库(在 Python 项目的“Squaring”子文件夹中):

平方.h:

int squaring(int a);

平方.c:

#include "squaring.h"
int squaring(int a)
    return a * a;

在 Eclipse 中,我创建了尝试使用该库的 Python 项目 (according to the instructions from the official website):

cSquaring.pxd:

cdef extern from "Squaring/squaring.h":
    int squaring(int a)

函数.pix:

cimport cSquaring
cpdef int count(int value):
    return cSquaring.squaring(value)

setup.py:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
setup(ext_modules=cythonize([Extension("Functions", ["Functions.pyx"])]))

main.py:

from Functions import count
if __name__ == '__main__':
    data = 1
    returned = count(data)
    print(returned)

使用完成了C代码的编译(没有任何错误):

python3 setup.py build_ext -i

但是当我在执行时运行 main.py,我得到 ImportError:

File “/home/denis/.p2/pool/plugins/org.python.pydev.core_7.3.0.201908161924/pysrc/pydevd.py”, line 2643, in <module>
main()
File “/home/denis/.p2/pool/plugins/org.python.pydev.core_7.3.0.201908161924/pysrc/pydevd.py”, line 2636, in main
globals = debugger.run(setup, None, None, is_module)
File “/home/denis/.p2/pool/plugins/org.python.pydev.core_7.3.0.201908161924/pysrc/pydevd.py”, line 1920, in run
return self._exec(is_module, entry_point_fn, module_name, file, globals, locals)
File “/home/denis/.p2/pool/plugins/org.python.pydev.core_7.3.0.201908161924/pysrc/pydevd.py”, line 1927, in _exec
pydev_imports.execfile(file, globals, locals) # execute the script
File “/home/denis/.p2/pool/plugins/org.python.pydev.core_7.3.0.201908161924/pysrc/_pydev_imps/_pydev_execfile.py”, line 25, in execfile
exec(compile(contents+“\n”, file, ‘exec’), glob, loc)
File “/home/denis/eclipse-workspace/ConnectionWithCPlusPlus/main.py”, line 1, in <module>
from Functions import count
ImportError: /home/denis/eclipse-workspace/ConnectionWithCPlusPlus/Functions.cpython-37m-x86_64-linux-gnu.so: undefined symbol: squaring

另一个使用 Cython 代码的项目(我没有创建 C 库,而是直接在 Cython 上编写代码)工作正常。

有什么问题?

【问题讨论】:

virgesmith,我不明白你的意思。请写下我应该替换什么代码以及我应该怎么做。 【参考方案1】:

您在 Cython 中包含了头文件,但您从未真正告诉它实现,即定义函数的库。您需要链接到通过编译您的 C 源代码生成的库,如 Cython docs 中所述。

在您的Functions.pyx 中,您必须在顶部添加这样的评论。

# distutils: sources = path/to/squaring.c

【讨论】:

以上是关于将 C 库与 Cython 一起使用时出现错误的主要内容,如果未能解决你的问题,请参考以下文章

将 Opencv_2.4.9 与 Visual Studio 一起使用时出现错误 C1075? [关闭]

在 Cython 中使用 move 方法时出现编译错误

尝试运行已编译的 Cython 代码时出现“python39.dll not found”错误 [重复]

将 .NET 4.0 与 dll 一起使用时出现未知错误

将 std::vector 与结构一起使用时出现不完整的类型错误

无法将 cpplist 导入 Cython?