C++ 需要帮助开始使用Boost.Python吗

C++ 需要帮助开始使用Boost.Python吗,c++,python,boost,boost-python,C++,Python,Boost,Boost Python,我正在尝试构建我的第一个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_PY

我正在尝试构建我的第一个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;
}
我已经链接到了
-lpython3.3m-lboost\u python-mt-lpython3.3
-还缺少什么


编辑:我想我已经链接到了
python3.3-config
列出的所有内容。由于缺少符号,链接仍然无法工作。

您缺少Python开发标题。您的Linux发行版应该为它们提供一个包。(例如,Debian或Ubuntu上的python dev)

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

此外,如果这没有帮助,并且仍然存在链接器错误,请使用“objdump-t--demangle/path/to/lib”找出库中包含哪些符号,以及库中是否包含您需要的符号。还要检查“ldd”的输出,其中列出了相关的共享对象。这将提示您链接哪个库


在我的系统上,我还有一个名为“python配置”和“python2.7-config”的程序。检查是否有类似的内容,因为该脚本知道至少要为python链接哪些库。类似的工具是pkg config,它更通用,也可能为boost提供信息。

当发生此特定链接器错误时,它通常是针对一个版本的Python(如Python 3.x头文件)构建应用程序的结果,而
boost_Python
库是针对不同版本构建的,比如2.x

在中,根据Python 3.x构建时,
init_模块
函数具有以下特征:

PyObject* boost::python::detail::init_module(PyModuleDef&, void(*)());
在构建Python2.x时使用以下签名:

PyObject* boost::python::detail::init_module(char const* name, void(*)());
从中可以看出,Boost.Python库中只存在一个函数。因此,考虑到Boost.Python库正在链接,而链接器只是抱怨无法解析3.x
init_module
函数,那么Boost.Python库很可能是针对Python2.x版本构建的,而应用程序代码是针对Python3.x头文件构建的。您可以通过转储Boost.Python库的符号并检查
init_模块
签名来验证这一点

要解决这个问题,请使用构建Boost.Python的相同版本的Python构建应用程序。在这种情况下,可以:

  • 使用Python2.x头文件和针对Python2.x库的链接构建应用程序
  • 针对Python3.x构建Boost.Python。文档描述了构建Boost的步骤,文档详细介绍了Boost.Python。可能需要使用
    --with Python
    参数显式提供Boost.Python将在
    引导过程中构建的Python可执行文件

    • 您还必须链接Boost.System以及链接器提到的任何其他库。另外,请尝试其他编译器,例如XCode()附带的Clang()。另外,尝试发布您的makefile。另一种尝试是使用bjam/b2而不是make。

      不确定这是否是执行此操作的方法,但似乎PY\u版本的十六进制设置错误。 如果你

      #define PY_VERSION_HEX 0x03300000
      

      在将boost.python头包含在boostpythont.cpp中之前?

      感谢您指出错误。但是我在OSX上,知道如何获取标题吗?Homebrew似乎没有一个公式
      python dev
      @cls我不使用OS X,所以我不能在那里提供任何建议。也许其他人可以找到.Headers,但存在链接器问题,我希望示例能够正常工作。
      python3.3-config
      为我提供了一些路径和标记,我已经添加了这些路径和标记,但没有任何效果(请参见上面的调用)
      otool
      (这显然是OSX相当于
      objdump
      )给了我例如
      $otool-T libboost\u python-mt.dylib libboost\u python-mt.dylib:Table of contents(0个条目)模块索引符号索引
      ldd
      在OSX上似乎不存在。我相信您正确诊断了问题。我现在正试图针对Python3.3构建Boost.Python。当我尝试构建Boost.Python时,我得到了
      gcc.link.dll../../../../../bin.v2/libs/python/build/gcc-4.2.1/debug/libboost_python.dylib ld:警告:找不到选项'-L/usr/local/cillar/python3/3.3.0/Frameworks/python.Frameworks/Versions/3.3/config'的目录ld:未知选项:-R collect2:ld返回1退出状态
      这里发生了什么事?@cls:如果使用苹果版本的GCC工具链,然后尝试将工具集指定为
      darwin
      ,而不是
      GCC
      。这是一个注释,不是答案。
      #define PY_VERSION_HEX 0x03300000