我一直在尝试按照http://docs.cython.org/src/userguide/external_C_code.html中概述的示例来使用来自c的cython声明,特别是:"你可以使C语言中定义的C类型,变量和函数可以被C代码访问通过使用public关键字声明它们与模块链接:"
integrate.pyx:
cdef public double f(double x):
return x**2-x
cdef public double integrate_f(double a, double b, int N):
cdef int i
cdef double s, dx
s = 0
dx = (b-a)/N
for i in range(N):
s += f(a+i*dx)
return s * dx
def g(a, b, N):
return integrate_f(a, b, N)
在使用python.exe setup.py build_ext --inplace --compiler=msvc
构建.c,.pyd,.h,.obj,.lib,.exp之后,我能够从python成功导入并运行integrate.g()
。但是,我的新目标是从VS2015的开发人员命令提示符中调用f(double x)
和integrate_f(double a, double b, int N)
。
按照上面链接的说明,我创建了一个integrate_main.c文件:
#include <Python.h>
#include "integrate.h"
#include <stdio.h>
double f() {
Py_Initialize();
initintegrate();
double x = 3;
Py_Finalize();
return f(x);
}
double main()
{
printf("%d", f());
return f();
}
现在,integration_main.c,integrate.c,integrate.pyd,integrate.h,integrate.obj,integrate.lib,integrate.exp就位于同一目录下。我尝试使用cl integrate_main.c
编译integrate_main.c但是得到以下语法错误:
...\integrate.h(15): error C2061: syntax error: identifier 'f'
...\integrate.h(15): error C2059: syntax error: ';'
...\integrate.h(15): error C2059: syntax error: '<parameter-list>'
...\integrate.h(16): error C2061: syntax error: identifier 'integrate_f'
...\integrate.h(16): error C2059: syntax error: ';'
...\integrate.h(16): error C2059: syntax error: '<parameter-list>'
当cython成功创建.obj和可导入的.pyd时,我不明白integ.c中存在语法错误。