如何使用文件simulate_fast.c
中的C函数Cython进行编译,这也取决于更多的C文件matrix.c
和random_generator.c
。这似乎必须是Cython的常见用法,但在阅读完文档之后,我仍然无法弄清楚如何去做。我的目录包含以下文件
matrix.c
matrix.h
random_generator.c
random_generator.h
simulate_fast.c
simulate_fast.h
test.c
simulate_fast_c.pyx
setup.py
matrix.c
和random_generator.c
文件包含独立功能。 simulate_fast.c
文件使用这两个文件并包含我想要向Python公开的函数simulate()
。
test.c
文件测试所有C功能是否正确运行,即我可以执行
$ gcc test.c simulate_fast.c matrix.c random_generator.c -o test
编译成可运行的test
可执行文件。
我现在的问题是尝试用Cython编译它。我的.pyx
文件是
cimport cython
cdef extern from "simulate_fast.h":
int simulate()
def simulate_cp():
return simulate()
然后我使用基本的setup.py
from distutils.core import setup
from Cython.Build import cythonize
from Cython.Distutils import build_ext
import numpy as np
setup(
name='simulate_fast',
ext_modules = cythonize(["simulate_fast_c.pyx"]),
include_dirs=[]
)
但是如果我尝试使用
编译它python3 setup.py build_ext --inplace
我收到错误
In file included from simulate_fast_c.c:492:0:
simulate_fast.h:89:28: error: field ‘RG’ has incomplete type
struct RandomGenerator RG;
在RandomGenerator
中声明结构random_generator.h
。
如何告诉编译器我们在编译时还必须考虑matrix
和random_generator
文件。
更新
如果在评论中说ead
,我在random_generator.h
中加入了matrix.h
和simulate_fast.h
,那么该程序现在可以编译。但是,当我尝试在Python中导入simulate_fast_c
模块时,我得到ImportError
:
undefined symbol: simulate
此外,如果我将simulate_fast.pyx
中的extern声明行更改为
cdef extern from "simulate_fast.c":
int simulate()
然后我收到导入错误
undefined symbol: get_random_number
这是random_generator.h
答案 0 :(得分:1)
cythonized模块必须链接到包含已编译C代码的共享库或嵌入它。后者的一种方法是将C源列为"扩展",然后将此扩展传递给cythonize命令,如Cython's documentation中所述
链接中的示例setup.py
文件可以通过(模数导入)来汇总:
setup(
ext_modules = cythonize(Extension("simulate_fast", ["matrix.c", "random_generator.c", "simulate_fast_c.pyx"]))
)