2014-09-03 56 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