2013-05-26 64 views
5

我有這樣的C代碼:未定義參考`PyString_FromString」

... [SNIP] ... 
for(Node = Plugin.Head; Node != NULL; Node = Node->Next) { 
    //Create new python sub-interpreter 
    Node->Interpreter = Py_NewInterpreter(); 
    if(Node->Interpreter == NULL) { 
     Die("Py_NewInterpreter() failed"); 
    } 

    //Create path to plugins main source file 
    snprintf(Filename, FILENAME_MAX, "%s/main.py", Node->File); 

    //Convert filename to python string 
    PFilename = PyString_FromString(Filename); 
    if(PFilename == NULL) { 
     Die("PyString_FromString(%s) failed", Filename); 
    } 

    //Import plugin main source file 
    PModule = PyImport_Import(PFilename); 
    if(PModule == NULL) { 
     Die("PyImport_Import(%s) failed", Filename); 
    } 

    //Deallocate filename 
    Py_DECREF(PFilename); 

    //Get reference to onLoad function from module 
    PFunction = PyObject_GetAttrString(PModule, "onLoad"); 
    if(PFunction == NULL) { 
     Die("PyObject_GetAttrString() failed"); 
    } 
} 
... [SNIP] ... 

編譯時其中給出這個錯誤:

/tmp/ccXNmyPy.o: In function `LoadPlugins': 
/home/alex/Code/Scribe/Scribe.c:693: undefined reference to `PyString_FromString' 
collect2: error: ld returned 1 exit status 

Python.h被包括在源文件的頂部。

我與編譯:

gcc -funwind-tables -rdynamic -I /usr/include/python2.7/ -g -o Scribe Scribe.c -lcurses `python-config --cflags` `python-config --ldflags` -Wall 

我立足於Python的C-API文檔的代碼,從這裏開始:

http://docs.python.org/2/c-api/

具體做法是:

http://docs.python.org/2/c-api/string.html?highlight=pystring_fromstring#PyString_FromString

我不知道爲什麼這是hap pening,halp? = c

+0

其他對Python C-Api函數的引用是否存在這個問題呢?還是隻是這個用於'PyString_FromString'? – martineau

+0

@martineau它只是PyString_FromString,該行註釋掉它編譯得很好。 – Alex

+0

它看起來像一個鏈接器 - 不是編譯器 - 錯誤。你不需要一個'-L/path/to/libs'選項,它可以找到Python C-Api函數的目標代碼嗎? – martineau

回答

4

解決了它,感謝martineau的幫助。

變成python-config --cflagspython-config --ldflags行生成的標誌,其中包括搜索路徑中的python3.3 include目錄並鏈接到python3.3 lib。

很自然地,python3.3在python2.7 C-API中不能很好地工作,這是造成這個問題的原因。

我的解決辦法是複製的python-config --cflagspython-config --ldflags輸出和編輯它,所以它包括python2.7而不是python3.3m:

-I/usr/include/python2.7 -I/usr/include/python2.7 -Wno-unused-result -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 

-lpthread -ldl -lutil -lm -lpython2.7 -Xlinker -export-dynamic 

相反的:

-I/usr/include/python3.3m -I/usr/include/python3.3m -Wno-unused-result -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 

-lpthread -ldl -lutil -lm -lpython3.3m -Xlinker -export-dynamic 
+0

很高興看到你解決了你的問題。 – martineau

+0

嗯,這似乎不是我的問題的來源,因爲我的旗幟已經看起來不錯。 –

1

的順序圖書館很重要。嘗試使用庫列表中最後出現的-lpython2.7進行編譯。