C++ 动态库中的boost python包装器未定义引用
我目前正试图将一个复杂程序的一部分放入一个动态库中。这部分由一些类组成,这些类也用boostpython包装到一个模块中,以便再次嵌入。这是dll源代码的简化版本 Hello.cpp: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:
#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)