2013-08-07 11 views
0

我嘗試把Python在我的C++應用程序,但鏈接口口聲聲說此錯誤:的Python在C++:無法解析的外部

[ILINK32 Error] Error: Unresolved external '_PyModule_Create2TraceRefs' referenced from E:\CPP PROJECTS\ANDERLICHT\WIN32\DEBUG\ANDERLICHT.OBJ 

我用英巴卡迪諾C++ Builder的XE2,所以我轉換python33.lib與coff2omf.exe。

這是我在main.cpp中的代碼:

#include "anderlicht.c" 
#pragma comment(lib, "python33_omf.lib") 

// In main(): 
PyImport_AppendInittab("anderlicht",PyInit_anderlicht); 
Py_SetProgramName(programName.w_str()); 
Py_Initialize(); 

在anderlicht.c包含在Python.h。我需要做些什麼來解決這個錯誤?

+0

您需要提供更多信息:您從哪裏得到了python33.dll,python33.lib和python.h?如果你自己建造它們,你是如何建造它們的?您的項目有哪些編譯和鏈接設置? – abarnert

回答

0

這個問題很可能是您在構建代碼時使用了不同的編譯器標誌,而不是構建Python DLL時使用的編譯器標誌。特別是,PyModule_Create2TraceRefs僅在您有-DPy_TRACE_REFS(通常在Unix上通過make命令中的EXTRA_CFLAGS傳入;我不知道如何在Windows上使用Embarcadero C++ Builder時執行)。通常,這沒有定義 - 特別是,如果您使用的是預構建的Python二進制文件中的DLL,則不會定義它。

所以,如果你想在構建你的代碼時使用自定義標誌,你需要用相同的標誌來重建Python本身。否則,您需要獲取用於構建Python的標誌,並在構建代碼時使用相同的標誌。

在Unix上,這很簡單:只需調用python3.3-config --cflagspython3.3-config --ldflags即可讓標誌傳遞到編譯和鏈接步驟。在Windows上,它不那麼微不足道。文檔中的Building C and C++ Extensions on Windows章節解釋瞭如何在使用用於構建Python本身的相同工具鏈(通常爲MSVC)時執行此操作,如果您使用mingw及其MSVC-compat功能,則在其他位置有關於如何執行此操作的文檔...但是如果你使用的是不同的工具鏈,你需要自己弄清楚一些。

0

我有同樣的問題,但我找到了一個不需要重建的解決方案。

如果您正在開發新的應用程序,那麼您處於調試模式:編譯器定義_DEBUG。在文件 「pyconfig.h」(近乎蟒蛇3.6.3線336),你可以找到:

#ifdef _DEBUG 
#define Py_DEBUG 
#endif 

=>中刪除此代碼。

如果你離開這個代碼,你是在Py_Debug模式,所以在object.h觸發此:

#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS) 
#define Py_TRACE_REFS 
#endif 

在modsupport.h定義了這個別名:

#ifdef Py_TRACE_REFS 
/* When we are tracing reference counts, rename module creation functions so 
    modules compiled with incompatible settings will generate a 
    link-time error. */ 
#define PyModule_Create2 PyModule_Create2TraceRefs 
#define PyModule_FromDefAndSpec2 PyModule_FromDefAndSpec2TraceRefs 
#endif 

所以你編譯器需要一個定製版本的Python。

現在享受您的標準嵌入式Python。