Python 将Cython指向C源文件

Python 将Cython指向C源文件,python,c,cython,Python,C,Cython,我有一个混合Python、Cython和C的项目,安排如下: root |- src |- foo foo.c |- name name.pxd name.pyx |- include |- foo foo.h setup.py 内容非常简单: foo.h: void add(int, double *, double *, double *); f

我有一个混合Python、Cython和C的项目,安排如下:

root
    |- src
        |- foo
            foo.c
    |- name
        name.pxd
        name.pyx
    |- include
        |- foo
            foo.h
    setup.py
内容非常简单:

foo.h:

void add(int, double *, double *, double *);
foo.c:

#include "foo/foo.h"
void add(int N, double * A, double * B, double * C) {
    for (int i = 0; i < N; i++) C[i] = A[i]+B[i];
}
name.pyx:

import numpy as np
cimport numpy as np

cpdef cython_add(np.ndarray[np.double_t, ndim=1] A, 
                 np.ndarray[np.double_t, ndim=1] B):
    cdef int N = min(A.shape[0], B.shape[0])
    cdef np.ndarray C = np.ndarray([N],dtype=np.double)
    add(N, <double*> A.data, <double*> B.data, <double*> C.data)
    return C
并使用以下命令进行编译:

CFLAGS="-I/path/to/root/include" python setup.py build_ext -i
它编译得很好,除了在python解释器中尝试导入名称时,我得到以下结果:

ImportError: dlopen(./name.so, 2): Symbol not found: _add
  Referenced from: ./name.so
  Expected in: dynamic lookup

我认为这意味着,即使所有内容都已编译,Cython实际上并没有将正确的文件链接在一起。我错过了什么?

结果我不得不改变两件事。我忘了告诉name.pyx导入name.pxd。因此,我不得不在name.pyx的顶部添加这一行:

当我在name.pyx本身中包含distutils头信息时,它也起作用,所以将这些行放在name.pyx的最顶端:

并将setup.py更改为:

CFLAGS="-I/path/to/root/include" python setup.py build_ext -i
ImportError: dlopen(./name.so, 2): Symbol not found: _add
  Referenced from: ./name.so
  Expected in: dynamic lookup
from name cimport add
#distutils: language = c
#distutils: sources = src/foo/foo.c
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
from numpy import get_include

extensions = [
  Extension("name", ["name/name.pyx"],
    include_dirs = ["include", get_include()])
]

setup(
  name = "name",
  ext_modules = cythonize(extensions)
)