2014-09-03 57 views
0

正如我的标题所说,我正在尝试开发Python的C扩展。我在这里跟着这篇教程,并且运行了setup.py脚本。当我运行python解释器并尝试导入新创建的模块时,我得到一个未定义符号的链接器错误:py_BuildValue。我也尝试编译它我自己,我得到了同样的错误加上一个错误,说Py_InitModule3是未定义的。我已经安装了python3.2-dev和python3-dev。这里是我的test.c的代码:链接器错误:Python的C/C++扩展

#include <python3.2/Python.h> 
static PyObject* Test(PyObject* self){ 
    return py_BuildValue("s","This is a test and my first trip into the world of python bindings!!"); 
} 

static PyMethodDef test_funcs[] ={{"testExtensions",(PyCFunction)Test, METH_NOARGS,"This is my First Extension!!"},{NULL}}; 

void initTest(void){ 
    Py_InitModule3("Test", test_funcs, "Extension module example!"); 
} 

而且我setup.py代码:

from distutils.core import setup, Extension 
setup(name='Test', version='1.0', \ 
    ext_modules=[Extension('Test', ['test.c'])]) 

回答

2

这是因为函数被调用Py_BuildValue,而不是py_BuildValue。 C区分大小写。如果您在编译消息中进一步检查,那么您可能还会在此处警告该函数被隐式声明。

+0

哦,嗯。我正在学习一个教程。事实上,科迪被复制和粘贴。但我想这可能是谢谢。 – rady 2014-09-03 02:25:03

+0

我跟进了这个。我一直都知道这样做很愚蠢,但看起来这不是问题。 – rady 2014-09-03 12:32:11

+0

@rady:你确定它是一样的错误?当我尝试编译你的代码但修改了'Py_BuildValue'的大小写时,错误就转而建立了'Py_InitModule3',这是可以理解的,因为这是一个Python 2函数,而在你看来你正在尝试为Python 3进行编译。 – Dolda2000 2014-09-03 15:41:09