cython编译错误:函数的多重定义

时间:2013-10-08 23:20:26

标签: python compiler-errors cython

我创建了一个名为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有多个定义。谁能告诉我这个问题?

1 个答案:

答案 0 :(得分:6)

您的文件发布时出现了许多问题,我不知道哪一个导致您的实际代码出现问题 - 特别是因为您向我们展示的代码没有,也不可能生成那些错误。

但如果我解决了所有明显的问题,那么一切正常。那么,让我们来看看所有这些:

您的setup.py错过了顶部的导入,因此它会立即失败并显示NameError

接下来,有多个拼写错误 - ExtensonExtensionbuld_extbuild_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'])
    ])

多田。