我创建了一个名为test.c的c文件,其中包含两个定义如下的函数:
#include<stdio.h>
void hello_1(void){
printf("hello 1\n");
}
void hello_2(void){
printf("hello 2\n");
}
之后,我按如下方式创建test.pyx:
import cython
cdef extern void hello_1()
设置文件如下:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(cmdclass={'buld_ext':build_ext},
ext_modules=[Extension("test",["test.pyx", "test.c"],
include_dirs=[np.get_include()],
extra_compile_args=['-g', '-fopenmp'],
extra_link_args=['-g', '-fopenmp', '-pthread'])
])
当我运行安装文件时,它总是报告hello_1并且hello_2有多个定义。谁能告诉我这个问题?
答案 0 :(得分:6)
您的文件发布时出现了许多问题,我不知道哪一个导致您的实际代码出现问题 - 特别是因为您向我们展示的代码没有,也不可能生成那些错误。
但如果我解决了所有明显的问题,那么一切正常。那么,让我们来看看所有这些:
您的setup.py
错过了顶部的导入,因此它会立即失败并显示NameError
。
接下来,有多个拼写错误 - Extenson
为Extension
,buld_ext
为build_ext
,我认为还有一个我已经修复但不记得了。
我剥离了numpy和openmp的东西,因为它与你的问题无关,而且更容易让它脱离。
当您修复所有这些并实际运行设置时,下一个问题立即显而易见:
$ python setup.py build_ext -i
running build_ext
cythoning test.pyx to test.c
您要么使用test.c
生成的文件覆盖test.pyx
文件,要么幸运的话,忽略生成的test.c
文件并使用现有的test.c
文件1}}好像它是test.pyx
的cython编译输出。无论哪种方式,您都在编译同一个文件两次并尝试将结果链接在一起,因此您的多个定义。
您可以将Cython配置为使用该文件的非默认名称,或者更简单地说,遵循通常的命名约定,并且没有尝试使用test.pyx
的{{1}}第一名。
所以:
ctest.c:
test.c
test.pyx:
#include <stdio.h>
void hello_1(void){
printf("hello 1\n");
}
void hello_2(void){
printf("hello 2\n");
}
setup.py:
import cython
cdef extern void hello_1()
运行它:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(cmdclass={'build_ext':build_ext},
ext_modules=[Extension("test",["test.pyx", "ctest.c"],
extra_compile_args=['-g'],
extra_link_args=['-g', '-pthread'])
])
多田。