2011-01-06 37 views
1

我一直在試圖讓Python/C庫喜歡我的mingW編譯器。蟒蛇在線捐贈; http://docs.python.org/c-api/intro.html#include-files只提到我需要導入python.h文件。我從安裝目錄中抓取它(如Windows平臺所需),並通過編譯腳本對其進行測試: #include "Python.h"。這編譯好。接下來,我嘗試了代碼片段所示蟒蛇/ C API頁面上低一點:如何正確設置python/c庫?

PyObject *t; 
t = PyTuple_New(3); 
PyTuple_SetItem(t, 0, PyInt_FromLong(1L)); 
PyTuple_SetItem(t, 1, PyInt_FromLong(2L)); 
PyTuple_SetItem(t, 2, PyString_FromString("three")); 

出於某種原因,編譯器會編譯代碼,如果我刪除最後一個4線(使只剩下pyObject變量定義),但調用元組的實際構造函數返回錯誤。

我可能錯過了一些完全明顯的東西,因爲我對C非常陌生,但有人知道它是什麼嗎?

+0

並使其返回什麼錯誤? – geoffspear 2011-01-06 20:47:24

+0

「未定義參照<函數名>」,其中每個呼叫到Python函數給出了相同的錯誤。 – Bartvbl 2011-01-06 21:11:57

回答

2

我已經做了一些狡猾的谷歌搜索,如果你在鏈接器階段出錯(錯誤信息可能有十六進制字符串或對ld的引用),你可能需要確保隨Windows附帶的Python庫版本已轉換爲GCC(MinGW)可以讀取的格式;請參閱here,以及其他網站。如果需要,還要確保GCC可以找到並使用庫文件,使用-L/my/directory-lpython26(正確替換您的路徑和Python版本)。

如果錯誤處於編譯階段(如果在消息中給出了行號),請確保您不需要將任何其他目錄添加到包含搜索路徑。 Python可能(我沒有使用它的C API)包含Python.h中的其他頭文件,這些文件存儲在其他目錄中。如果是這種情況,請使用-I/my/directory/標誌讓GCC告訴它在那裏搜索。但是,精確(複製粘貼)的錯誤消息將有所幫助。


警告:文本無法解答的問題!

你把代碼放在函數裏面嗎?嘗試把它main,像這樣:

int main(int argc, char *argv[]) { 
    PyObject *t; 
    t = PyTuple_New(3); 
    PyTuple_SetItem(t, 0, PyInt_FromLong(1L)); 
    PyTuple_SetItem(t, 1, PyInt_FromLong(2L)); 
    PyTuple_SetItem(t, 2, PyString_FromString("three")); 

    return 0; 
} 

該代碼將在執行程序來運行。然後你可以使用任何其他方法來檢查元組的內容。如果它不是作爲一個可執行程序單獨運行,那麼將它粘在一個命名不同的方法中;我假設你有另一種方法來調用該函數。

PyObject *t;定義是有效的功能作爲一個全局變量定義之外,還有一個函數內部,它聲明爲一個局部變量。其他四行是函數調用,它們必須位於另一個函數內。

上面的代碼本身並不是一個程序。你想寫一個C擴展到Python嗎?如果是這樣,請看一些更完整的文檔here

1

我已經取得了一些進展,因爲我問我的問題,我想我會以防萬一別人是有類似的問題分享。

這些都是我的錯誤:

In function `main': 
undefined reference to `_imp__PyTuple_New' 
undefined reference to `_imp__PyInt_FromLong' 
undefined reference to `_imp__PyTuple_SetItem' 
undefined reference to `_imp__PyInt_FromLong' 
undefined reference to `_imp__PyTuple_SetItem' 
undefined reference to `_imp__PyString_FromString' 
undefined reference to `_imp__PyTuple_SetItem' 

居然是失蹤MinGW的編譯器庫的結果的誤差。因此,只有包括源頌的頭文件是不夠的,還需要一個特殊的文件(.lib,即.o,.A,..)需要被列入編譯。它可以使用-l [路徑]標誌MinGW的命令行,但我發現的代碼塊(http://www.codeblocks.org/)是最方便的用在這裏。創建項目並轉到Project> Build options ..後,您可以在鏈接器設置選項卡下指定庫文件的位置。當你完成後,建立這個項目,它會有希望的工作。

我希望任何人有類似問題的努力已經從這個:)幫助