C++ 推进python问题

C++ 推进python问题,c++,boost,boost-python,C++,Boost,Boost Python,我试图使用boost的python模块向python公开我的一个类。我有一个名为StatusEffect的类,我想向python公开它。为此,我在StatusEffect的类定义之后的StatusEffect.h文件中创建了它 BOOST_PYTHON_MODULE(StatusEffect) { boost::python::class_<StatusEffect>("StatusEffect") .def("GetPriority", &Statu

我试图使用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);
}
BOOST\u PYTHON\u模块(StatusEffect)
{
boost::python::class(“StatusEffect”)
.def(“GetPriority”,&StatusEffect::GetPriority)
.def(“GetDescription”,&StatusEffect::GetDescription)
.def(“GetName”,&StatusEffect::GetName);
}
我想在python中从一个在头中声明的函数中使用它,如下所示:

初选

#include <boost\python.hpp>
#include <StatusEffects\StatusEffect.h>
#include "ScriptDeclarations.h";
extern void Test();
#包括
#包括
#包括“ScriptDeclarations.h”;
外部空隙试验();
在初选中也是如此

#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();
  }
}
#包括“Primaries.h”
阶级效应;
使用名称空间boost::python;
类CPP类{
公众:
int getNum(){
返回7;
}
};
BOOST_PYTHON_模块(CppMod){
类(“CPP类”)
.def(“getNum”,&CppClass::getNum);
}
无效测试()
{
类mClass;
尝试
{
PyImport_AppendInittab(“CppMod”、&initCppMod);
PyImport_AppendInittab(“StatusEffect”和initStatusEffect);
Py_初始化();
对象主模块((
句柄(借来的(PyImport_AddModule(“uuu main_uuu“)”));
object main_namespace=main_module.attr(“uu dict_uu”);
状态效应(“匆忙”);
main_名称空间[“eff”]=ptr(&effect);
句柄被忽略((PyRun_字符串(“print eff.GetName()\n”,
Py_文件输入,
main_namespace.ptr(),
main_namespace.ptr());
/*主命名空间[“CppClass”]=类(“CppClass”)
.def(“getNum”,&CppClass::getNum);
main_名称空间[“cpp”]=ptr(&mClass);
忽略句柄((PyRun_字符串(“print cpp.getNum()\n”,
Py_文件输入,
main_namespace.ptr(),
main_namespace.ptr())*/
} 
捕获(已设置错误)
{
PyErr_Print();
}
}
但是,当我执行此操作时,会出现以下错误:

错误16错误LNK2001:未解析的外部符号“public:class std::basic_string,class std::allocator>_uthiscall StatusEffect::GetDescription(void)”(?GetDescription@StatusEffect@@QAE?AV?$basic_string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@XZ)C:\KHMP\Game\u Cpp\KHMPCpp\KHMPCpp\GameCharacter.obj KHMPCpp

我确信这与我的python声明有关,因为当我删除它时,Test()中的相应代码编译正确。但是,如果我在Primaries.cpp中取消注释有关CppCLass的代码并使用CppCLass,那么一切都可以正常工作。python模块声明是否需要与使用它们的位置在同一个源文件中?如果是的话,有什么办法可以解决吗?我希望最终能够将我的类的所有Python包装器放在一个头文件中

谁能告诉我我做错了什么


谢谢

需要注意的一点是,包装器应该位于StatusEffect.cpp中,而不是StatusEffect.h或单独的cpp文件中。但是,无论如何都应该是可以的,因为所有的东西都应该被导出。我还将用Python编写一个测试脚本,而不是尝试从C测试它

没有足够的信息来解释代码不工作的原因。需要考虑的一些事项:

  • GetDescription有实现吗?它是一个纯粹的虚拟函数吗
  • 您的StatusEffect类是否在不同的模块中?如果是的话,它是否已被禁用(如果您在Windows上)

  • 在使用boost::python包装器之前,错误似乎指向了一个问题。你试过评论你的Python东西,只是想调用StaseSuffel::直接从你的测试程序中获取描述?

    你应该考虑改变标题。站点上的每一个问题都是一个问题,标记中包含了boost::python这一事实。你的头衔真的没告诉我什么。此外,从外观上看,这是一个C++链接器问题而不是一个Booost::Python问题。