需要帮助开始使用Boost.Python

Need help getting started with Boost.Python

本文关键字:Boost Python 开始 帮助      更新时间:2023-10-16

我正在尝试构建我的第一个Boost。Python示例。

#include <iostream>
#include <boost/python.hpp>
using namespace boost::python;

class Hello {
public:
    std::string greet() {
        std::cout << "Hello World" << std::endl;
    }
};

BOOST_PYTHON_MODULE(hello)
{
    class_<Hello>("Hello")
        .def("greet", &Hello::greet);
}
int main() {
    std::cout << "Boost.Python Test" << std::endl;
    Hello hello;
    hello.greet();
    return 0;
}

编辑:正如@cdhowie指出的那样,Python开发头文件丢失了。我已经找到并包含了所需的头文件。现在链接器报错了:

   10:43:58 **** Build of configuration BoostPythonTest-DPar for project BoostPythonTest 
****
make all 
Building file: ../src/BoostPythonTest.cpp
Invoking: GCC C++ Compiler
/usr/local/bin/g++-4.7 -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -I/usr/include -I/usr/local/Cellar/gcc/4.7.2/gcc/include/c++/4.7.2 -O0 -g3 -p -pg -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/BoostPythonTest.d" -MT"src/BoostPythonTest.d" -o "src/BoostPythonTest.o" "../src/BoostPythonTest.cpp"
Finished building: ../src/BoostPythonTest.cpp
Building target: libBoostPythonTest-DPar.dylib
Invoking: MacOS X C++ Linker
/usr/local/bin/g++-4.7 -L/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/lib/python3.3/config-3.3m -L/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/lib -L/usr/local/Cellar/boost/1.51.0/lib -std=c++11 -Xlinker -ldl -framework CoreFoundation -lpython3.3m -dynamiclib -o "libBoostPythonTest-DPar.dylib"  ./src/BoostPythonTest.o   -lpython3.3m -lboost_python-mt -lpython3.3
Undefined symbols for architecture x86_64:
  "boost::python::detail::init_module(PyModuleDef&, void (*)())", referenced from:
      _PyInit_hello in BoostPythonTest.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [libBoostPythonTest-DPar.dylib] Error 1

我已经链接到-lpython3.3m -lboost_python-mt -lpython3.3 -还缺少什么?

编辑:我想我已经链接到python3.3-config列出的所有内容。链接仍然不能工作,因为缺少符号。

当这个特定的链接器错误发生时,它通常是基于某个版本的Python构建应用程序的结果,比如Python 3。而boost_python库是针对不同版本构建的,例如2.x.

boost/python/module_init.hpp中,init_module函数在针对Python 3.x构建时具有以下签名:

PyObject* boost::python::detail::init_module(PyModuleDef&, void(*)());

和以下签名在Python 2.x上构建时:

PyObject* boost::python::detail::init_module(char const* name, void(*)());

在实现中可以看到,只有一个函数会出现在Boost中。Python库。因此,给定Boost。Python库正在被链接进来,而链接器只是抱怨无法解析3。x init_module函数,那么很有可能Boost。Python库是基于Python 2构建的。而应用程序代码是基于Python 3构建的。X头文件。您可以通过转储Boost来验证这一点。Python库的符号,并检查init_module签名。

要解决这个问题,使用Boost使用的Python版本来构建应用程序。Python诞生了。在本例中,要么:

  • 使用Python 2构建应用程序。x头文件和Python 2的链接。x库。
  • 建立刺激。Python对Python 3.x。本文档描述了构建Boost的步骤,并详细介绍了Boost. python。可能需要显式地提供Python可执行文件。Python将在bootstrap进程中使用--with-python参数进行构建。

您错过了Python开发头文件。您的Linux发行版应该有一个相应的包。(例如,Debian或Ubuntu上的python-dev)

您正在构建一个共享库,因为这就是二进制Python模块。为此,您需要-shared或-dynamic(请查看文档),并且不应该有main()函数。

进一步,如果这没有帮助,你仍然有链接器错误,使用"objdump -T——demangle/path/to/lib"来找出一个库包含哪些符号以及它是否有你需要的那些符号。还要检查"ldd"的输出,它列出了依赖的共享对象。这应该会给你一个链接哪个库的提示。

在我的系统中,我也有一个名为"python-config"answers"python2.7-config"的程序。检查是否有类似的东西,因为这个脚本知道至少要为python链接哪些库。一个类似的工具是pkg-config,它更通用,也可能为boost提供信息。

不确定这是否是这样做的方式,但似乎PY_VERSION_HEX设置错误。如果

#define PY_VERSION_HEX 0x03300000

在包含boost之前。在你的BoostPythonTest.cpp?

您还必须与Boost链接。系统,以及链接器提到的任何其他库。也可以尝试其他编译器,比如XCode附带的Clang(https://svn.boost.org/trac/boost/ticket/7536) (XCode 4.5中最新的Clang位置)。另外,试着发布你的makefile。另一种尝试是使用bjam/b2而不是make.