C++ 动态库中的boost python包装器未定义引用

C++ 动态库中的boost python包装器未定义引用,c++,boost-python,undefined-reference,dynamic-library,C++,Boost Python,Undefined Reference,Dynamic Library,我目前正试图将一个复杂程序的一部分放入一个动态库中。这部分由一些类组成,这些类也用boostpython包装到一个模块中,以便再次嵌入。这是dll源代码的简化版本 Hello.cpp: #include <boost/shared_ptr.hpp> #include <boost/make_shared.hpp> #include <boost/python.hpp> #include <Foo.h> using namespace boost:

我目前正试图将一个复杂程序的一部分放入一个动态库中。这部分由一些类组成,这些类也用boostpython包装到一个模块中,以便再次嵌入。这是dll源代码的简化版本

Hello.cpp:

#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#include <boost/python.hpp>
#include <Foo.h>

using namespace boost::python;

typedef boost::shared_ptr<Hello> hello_ptr;

BOOST_PYTHON_MODULE(Hello)
{
    class_<Hello, hello_ptr>("Hello")
        .def("say_hello", &Hello::say_hello)
    ;
};


void Hello::say_hello(){
    cout << "Hello World!" << endl;
}

void World::foo(){
    Py_Initialize();

    try {
        PyRun_SimpleString(
            "hello = None\n"
            "\n"
            "def setup(hello_from_cxx):\n"
            "    print 'setup called with', hello_from_cxx\n"
            "    global hello\n"
            "    hello = a_foo_from_cxx\n"
            "\n"
            "def run():\n"
            "    hello.say_hello()\n"
            "\n"
            "print 'main module loaded'\n"
        );
        //initialize eviroment
        initHello();

        hello_ptr hello = boost::make_shared<Hello>();

        object main = object(handle<>(borrowed(
            PyImport_AddModule("__main__")
        )));

        // pass the reference to hello into python:
        object setup_func = main.attr("setup");
        setup_func(hello);

        // now run the python 'main' function
        object run_func = main.attr("run");
        run_func();
    }
    catch (error_already_set) {
        PyErr_Print();
    }
}
我将代码::块与MinGW一起使用

这个问题已经让我几天没睡了,我似乎找不到解决它的方法。希望你能帮助我

提前谢谢

更新:

我现在尝试使用普通的Python C API来解决这个任务。在这里,定义Python_模块(BOOST_Python_Module())的步骤是通过定义一个函数来完成的,该函数类似于:

PyMODINIT_FUNC initHello(void){
...
}
现在写在这之前

#define PyMODINIT_FUNC void

解决了这个错误。现在有人知道boost.python库如何定义boost\u python\u模块函数了吗?也许也有这样的解决办法?我在源文件中找不到任何Pymodini_FUNC内容

我自己找到了解决办法

好像我已经猜到了。我们需要这样定义BOOST_PYTHON_MODULE_INIT(name)

#   define BOOST_PYTHON_MODULE_INIT(name)                               \
  void BOOST_PP_CAT(init_module_,name)();                               \
extern "C" __attribute__ ((__visibility__("default"))) _BOOST_PYTHON_MODULE_INIT(name)
事实上,我在其中一个头文件中发现了这一点,前面有一些#ifdef,但它们似乎工作不正常。至少对我来说不是

PyMODINIT_FUNC initHello(void){
...
}
#define PyMODINIT_FUNC void
#   define BOOST_PYTHON_MODULE_INIT(name)                               \
  void BOOST_PP_CAT(init_module_,name)();                               \
extern "C" __attribute__ ((__visibility__("default"))) _BOOST_PYTHON_MODULE_INIT(name)