我目前正在尝试将复杂程序的一部分放入动态库中。这部分由一些类组成,这些类也用 boost python 包装到一个模块中,以便再次嵌入。这是 dll 源的简化版本。
你好.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();
}
}
你好.h
#ifndef HELLO_H_INCLUDED
#define HELLO_H_INCLUDED
#include <iostream>
#include <boost/python.hpp>
using namespace std;
class Hello{
public:
void say_hello();
};
class World{
public:
void foo();
};
#endif // HELLO_H_INCLUDED
然后,在应用程序的主函数中,我创建了一个嵌入 python 的类的实例,但它给出了对 World::foo() 的未定义引用,即使该函数是在动态库 libFoo.dll 中定义的,它也链接到主要应用。
主.cpp:
#include <iostream>
#include <Hello.h>
using namespace std;
int main(){
cout << "Test" << endl;
World world;
world.foo();
}
安慰:
undefined reference to `World::foo()'
我在 MinGW 中使用 Code::Blocks。
这个问题让我有好几天没睡了,我似乎无法找到解决它的方法。希望您能够帮助我。
提前致谢。
更新:
我现在尝试使用普通的 Python C API 来完成这项任务。定义与此错误肯定相关的 Python_Module (BOOST_PYTHON_MODULE()) 的步骤是通过定义如下函数来完成的:
PyMODINIT_FUNC initHello(void){
...
}
现在写在前面
#define PyMODINIT_FUNC void
解决了错误。现在有人知道 boost.python 库是如何定义 BOOST_PYTHON_MODULE 函数的吗?也许也有这种解决方案?我在源文件中找不到任何 PyMODINIT_FUNC 内容。