【问题标题】:Need help getting started with Boost.Python需要帮助开始使用 Boost.Python
【发布时间】:2013-04-02 12:19:54
【问题描述】:

我正在尝试构建我的第一个 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 列出的所有内容。由于缺少符号,链接仍然不起作用。

【问题讨论】:

    标签: c++ python boost boost-python


    【解决方案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(*)());
    

    implementation 中可以看出,Boost.Python 库中只有一个函数。因此,鉴于正在链接 Boost.Python 库,并且链接器只是抱怨无法解析 3.x init_module 函数,那么 Boost.Python 库很可能是针对 Python 构建的2.x 版本,而应用程序代码是针对 Python 3.x 头文件构建的。您可以通过转储 Boost.Python 库的符号并检查 init_module 签名来验证这一点。

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

    • 使用 Python 2.x 头文件构建应用程序并链接到 Python 2.x 库。
    • 针对 Python 3.x 构建 Boost.Python。 This 文档描述了构建 Boost 的步骤,this 文档详细介绍了 Boost.Python。可能有必要使用--with-python 参数显式提供在bootstrap 过程中构建Boost.Python 的Python 可执行文件。

    【讨论】:

    • 我相信你正确地诊断了这个问题。我现在正在尝试针对 Python 3.3 构建 Boost.Python。
    • 当我尝试构建 Boost.Python 时,我得到了the following errorgcc.link.dll ../../../../bin.v2/libs/python/build/gcc-4.2.1/debug/libboost_python.dylib ld: warning: directory not found for option '-L/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/lib/python3.3/config' ld: unknown option: -R collect2: ld returned 1 exit status这里发生了什么?
    • @cls:如果您使用 Apple 版本的 GCC 工具链,请尝试将工具集指定为 darwin 而不是 gcc
    【解决方案2】:

    您缺少 Python 开发标头。你的 Linux 发行版应该有一个包。 (例如,Debian 或 Ubuntu 上的 python-dev。)

    【讨论】:

    • 感谢您指出错误。但我在 OSX 上,知道如何获取标题吗? Homebrew 似乎没有公式python-dev
    • @cls 我不使用 OS X,所以我不能在那里提供任何建议。也许其他人可以。
    • 已找到标题,但存在链接器问题,我想让示例正常工作。
    【解决方案3】:

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

    此外,如果这没有帮助并且您仍然有链接器错误,请使用“objdump -T --demangle /path/to/lib”来找出库包含哪些符号以及它是否包含您需要的符号.还要检查“ldd”的输出,它列出了依赖的共享对象。这应该会提示您链接哪个或哪些库。

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

    【讨论】:

    • python3.3-config 给了我一些我添加的路径和标志,但没有效果(参见上面的调用)。 otool(这显然是objdump 的 OSX 等价物)给了我例如$ otool -T libboost_python-mt.dylib libboost_python-mt.dylib: Table of contents (0 entries) module index symbol indexldd 在 OSX 上似乎不存在。
    【解决方案4】:

    不确定这是否是这样做的方法,但似乎 PY_VERSION_HEX 设置错误。 如果你发生了什么

    #define PY_VERSION_HEX 0x03300000
    

    在您的 BoostPythonTest.cpp 中包含 boost.python 标头之前?

    【讨论】:

    • 这是评论,不是答案。
    【解决方案5】:

    您还必须与 Boost.System 以及链接器提到的任何其他库进行链接。此外,尝试其他编译器,例如 XCode(Latest Clang location in XCode 4.5) 附带的 Clang(https://svn.boost.org/trac/boost/ticket/7536)。另外,尝试发布您的makefile。另一种尝试是使用 bjam/b2 而不是 make。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-03
      • 2018-02-16
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-30
      • 2013-12-25
      相关资源
      最近更新 更多