2013-04-24 77 views
-2

我想用C API构建一个Python模块/扩展写的,但它失败:构建Python(2.7)模块上GCC 4.8失败

% python2 cmath.py build 
running build 
running build_ext 
building 'c_math' extension 
creating build 
creating build/temp.linux-x86_64-2.7 
gcc -pthread -fno-strict-aliasing -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -DNDEBUG -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python2.7 -c c_math.c -o build/temp.linux-x86_64-2.7/c_math.o 
c_math.c:18:5: warning: initialization from incompatible pointer type [enabled by default] 
{"more", c_math_more, METH_VARARGS, "n + nn Using C API"}, 
^ 
c_math.c:18:5: warning: (near initialization for ‘c_mathMethods[0].ml_meth’) [enabled by default] 
In file included from /usr/include/python2.7/Python.h:58:0, 
      from c_math.c:1: 
/usr/include/python2.7/pyport.h:802:39: error: expected ‘,’ or ‘;’ before ‘void’ 
#    define PyMODINIT_FUNC void 
           ^
c_math.c:22:1: note: in expansion of macro ‘PyMODINIT_FUNC’ 
PyMODINIT_FUNC 
^ 
error: command 'gcc' failed with exit status 1 

我试图手动建立一个没有的distutils但我得到同样的错误/警告消息

c_math.c:

#include <Python.h> 

static PyObject * 
c_math_more(PyObject *self, PyObject *n, PyObject *nn) { 
    if (PyInt_Check(n) && PyInt_Check(nn)) { 
     float cn, cnn, result; 

     cn = PyInt_AsLong(n); 
     cnn = PyInt_AsLong(nn); 

     result = cn + cnn; 

     return PyInt_FromLong(result); 
    } 
} 

static PyMethodDef c_mathMethods[] = { 
    {"more", c_math_more, METH_VARARGS, "n + nn Using C API"}, 
    {NULL, NULL, 0, NULL} 
} 

PyMODINIT_FUNC 
initc_math() { 
    (void) Py_InitModule("c_math", c_mathMethods); 
} 

int 
main(int argc, char *argv[]) { 
    Py_SetProgramName(argv[0]); 

    Py_Initialize(); 

    initc_math(); 
} 

而且cmath.py:

from distutils.core import setup, Extension 

c_math = Extension('c_math', sources = ['c_math.c']) 

setup(name = 'c_math', 
     version = '1.0', 
     description = "c_math setup", 
     ext_modules = [c_math]) 

我在做什么不正确?

PS:请,如果存在于c_math.c其他错误(我的意思是不是由GCC显示错误)不说话,我想自己找到的错误^^

回答

4
static PyMethodDef c_mathMethods[] = { 
     {"more", c_math_more, METH_VARARGS, "n + nn Using C API"}, 
     {NULL, NULL, 0, NULL} 
- } 
+ }; 

你在最后丢失了一个分号...

+0

谢谢,在编译之后...我有更多的问题,并警告“警告:从不兼容指针类型初始化[默认启用]”如何修复这个 ?还有“警告:(接近'c_mathMethods [0] .ml_meth'的初始化)[默认启用]” – 2013-04-25 05:01:43

相关问题