我正在尝试使用boost的python模块将我的一个类暴露给python。我有一个名为StatusEffect的类,我想向python公开。为此,我要在StatusEffect的类定义之后的StatusEffect.h文件中创建此文件
BOOST_PYTHON_MODULE(StatusEffect)
{
boost::python::class_<StatusEffect>("StatusEffect")
.def("GetPriority", &StatusEffect::GetPriority)
.def("GetDescription", &StatusEffect::GetDescription)
.def("GetName", &StatusEffect::GetName);
}
我想在python头中声明的函数中使用它,如下所示:
Primaries.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:类std :: basic_string,类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包装器放在一个头文件中。
谁能指导我我做错了什么?
谢谢
最佳答案
需要注意的一件事是,包装程序应位于StatusEffect.cpp中,而不是StatusEffect.h中或单独的CPP文件中。但是,仍然应该可以,因为所有内容仍然应该导出。我还将用Python编写测试脚本,而不是尝试从C语言对其进行测试。
没有足够的信息来找出为什么您的代码无法正常工作。需要考虑的一些事项:
GetDescription有实现吗?它是纯虚拟功能吗?
您的StatusEffect类是否在其他模块中?如果是,是__dllexport'(如果您使用的是Windows)?
在进入boost :: python包装器之前,错误似乎指向一个问题。您是否尝试过注释掉您的python内容,而只是尝试直接从测试程序中调用StatusEffect :: GetDescription?
关于c++ - boost python问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5347395/