2011-03-18 58 views
0

我想暴露我的一個類到python使用boost的python模塊。我有一個名爲StatusEffect的類,我想暴露給python。要做到這一點,我在StatusEffect.h文件StatusEffect助推python問題

的類定義
BOOST_PYTHON_MODULE(StatusEffect) 
{ 
    boost::python::class_<StatusEffect>("StatusEffect") 
     .def("GetPriority", &StatusEffect::GetPriority) 
     .def("GetDescription", &StatusEffect::GetDescription) 
     .def("GetName", &StatusEffect::GetName); 
} 

後創建這個我想用它裏面蟒蛇從標題爲使內聲明的函數:

初選.H

#include <boost\python.hpp> 
#include <StatusEffects\StatusEffect.h> 
#include "ScriptDeclarations.h"; 
extern void Test(); 

和Primaries.cpp

#include "Primaries.h" 
class StatusEffect; 
using namespace boost::python; 

class CppClass { 
public: 
    int getNum() { 
    return 7; 
    } 
}; 

     BOOST_PYTHON_MODULE(CppMod) { 
    class_<CppClass>("CppClass") 
    .def("getNum",&CppClass::getNum); 
} 
void Test() 
{ 
    CppClass mClass; 
    try 
    { 
    PyImport_AppendInittab("CppMod", &initCppMod); 
    PyImport_AppendInittab("StatusEffect", &initStatusEffect); 
    Py_Initialize(); 

    object main_module((
     handle<>(borrowed(PyImport_AddModule("__main__"))))); 

    object main_namespace = main_module.attr("__dict__"); 

    StatusEffect effect("Haste"); 
    main_namespace["eff"] = ptr(&effect); 
    handle<> ignored((PyRun_String("print eff.GetName()\n", 
            Py_file_input, 
            main_namespace.ptr(), 
            main_namespace.ptr()))); 

    /*main_namespace["CppClass"] = class_<CppClass>("CppClass") 
           .def("getNum",&CppClass::getNum); 
    main_namespace["cpp"] = ptr(&mClass); 
    handle<> ignored((PyRun_String("print cpp.getNum()\n", 
            Py_file_input, 
            main_namespace.ptr(), 
            main_namespace.ptr())));*/ 

    } 
    catch(error_already_set) 
    { 
    PyErr_Print(); 
    } 
} 

然而,當我這樣做,我得到以下錯誤:

錯誤16錯誤LNK2001:無法解析的外部符號「public:class std :: basic_string,class std :: allocator> __thiscall StatusEffect :: GetDescription(void)」(?GetDescription @ StatusEffect @@ QAE?AV?$ basic_string @ DU?$ char_traits @ D @ std @@ V?$ allocator @ D @ 2 @@ std @@ XZ)C:\ KHMP \ Game_Cpp \ KHMPCpp \ KHMPCpp \ GameCharacter.obj KHMPCpp

我很確定這與我的python聲明有關,因爲當我將它刪除時,以及來自Test()的相應代碼正確編譯。如果我取消註釋有關Primaries.cpp中CppCLass的代碼並使用CppClass,則一切正常。 python模塊聲明是否需要和它們使用的地方在同一個源文件中?如果是這樣,有沒有辦法解決這個問題?我想最終能夠將我的類的所有Python包裝放在一個頭文件中。

任何人都可以指導我,我做錯了什麼?

感謝

+0

你應該考慮改變標題。網站上的每個問題都是一個問題,而且它是boost :: python的事實在標籤中已經涵蓋。你的頭銜真的沒有告訴我什麼。另外,從它的外觀來看,這是一個C++鏈接器問題,而不是boost :: python問題。 – 2011-03-18 14:13:50

回答

1

有一點要注意的是,你的包裝應該是在你的StatusEffect.cpp,不StatusEffect.h或單獨的CPP文件。但是,無論如何,它應該是可以的,因爲所有東西都應該被導出。我還會用Python編寫測試腳本,而不是試圖從C中測試它。

沒有足夠的信息來確定代碼不工作的原因。一些需要考慮的事項:

  1. GetDescription是否有一個實現?它是純虛函數嗎?
  2. 您的StatusEffect類在不同的模塊中嗎?如果是,是否__dllexport'ed(如果你在Windows上)?

錯誤似乎指向一個問題,然後再到boost :: python包裝器。你有沒有嘗試過註釋掉你的Python的東西,只是直接從你的測試程序中調用StatusEffect :: GetDescription?