想知道如何开始的Boost.Python(Need help getting started wit

2019-08-21 09:18发布

我试图建立我的第一个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;
}

编辑:Python开发头不见了,因为@cdhowie指出。 我发现,其中包括所需的头文件。 现在,链接器在抱怨:

   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列表。 链接仍然没有由于缺少符号的工作。

Answer 1:

当这个特殊的链接器错误发生时,它往往是对的Python的一个版本,如Python 3.x的头文件的应用程序构建的结果,而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建造。 X版本,而应用程序代码已经建成对Python的3.x的头文件。 您可以通过倾销的Boost.Python库的符号验证这一点,并检查init_module签名。

为了解决这个问题,建立与相同版本的Python从Boost.Python的被构建的应用程序。 在这种情况下,无论是:

  • 建立与Python 2.x的头文件和链接反对的Python 2.x的库应用程序。
  • 构建Boost.Python的对Python的3.x的 该文件描述了建立升压的步骤, 这个文档进入详细的Boost.Python的。 它可能需要明确提供了Python从Boost.Python的将在建立对可执行bootstrap使用过程--with-python说法。


Answer 2:

这是因为丢失了Python开发头。 你的Linux发行版应该有一个包他们。 (例如, python-dev在Debian或Ubuntu)。



Answer 3:

你正在建设一个共享库,因为那是一个二进制Python模块是什么。 对于这一点,你需要-shared或-dynamic(检查文档),你不应该有一个main()函数。

此外,如果不帮助你,你仍然有链接错误,请使用“objdump的-T --demangle /路径/到/ lib目录”,以找出哪些符号库包含以及是否有那些你需要的。 同时检查“LDD”的输出,其中列出了相关共享对象。 这应该给你一个提示库或库连结的。

在我的系统,我也有一个被称为“蟒蛇 - 配置”和“python2.7-配置”程序。 检查您是否有类似的东西,因为这个脚本知道哪些库,至少对于蟒蛇链接。 类似的工具是pkg配置,这是比较普遍,并可能为提升信息了。



Answer 4:

不知道这是做它的方式,但它似乎PY_VERSION_HEX设置错误。 如果你会发生什么

#define PY_VERSION_HEX 0x03300000

之前,包括在你的BoostPythonTest.cpp Boost.Python的头?



Answer 5:

你也有Boost.System,以及通过链接中提到的任何其他库链接。 另外,尝试其他的编译器,如锵( https://svn.boost.org/trac/boost/ticket/7536 ),附带了XCode( XCode中4.5最新锵位置 )。 此外,尝试发布您的makefile。 另一种尝试是使用的bjam / B2的不是make。



文章来源: Need help getting started with Boost.Python