我想暴露我的一個類到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包裝放在一個頭文件中。
任何人都可以指導我,我做錯了什麼?
感謝
你應該考慮改變標題。網站上的每個問題都是一個問題,而且它是boost :: python的事實在標籤中已經涵蓋。你的頭銜真的沒有告訴我什麼。另外,從它的外觀來看,這是一個C++鏈接器問題,而不是boost :: python問題。 – 2011-03-18 14:13:50