链接 Boost.python 示例的问题

Posted

技术标签:

【中文标题】链接 Boost.python 示例的问题【英文标题】:Issues linking Boost.python example 【发布时间】:2018-02-10 07:54:08 【问题描述】:

我正在尝试编译 this 示例,但出现关于 undefined reference to PyInt_Type/PyString_FromString/PyNumber_Divide 等的错误。我已经将我的构建与 boost_pythonpython3.6m 关联起来。

我正在构建它 g++ example.cpp -L/usr/include/boost/python -lboost_python -lpython3.6m -I/usr/include/python3.6m

main.cpp

#include <boost/python.hpp>
#include <boost/python/detail/wrap_python.hpp>
#include <boost/python/exec.hpp>
#include <boost/python.hpp>
#include <iostream>
#include <string>
#include <Python.h>

using namespace boost::python;

int main() 

  Py_Initialize();
  object main_module = import("__main__");
  object main_namespace = main_module.attr("__dict__");

  object ignored = exec("hello = file('hello.txt', 'w')\n"
                        "hello.write('Hello world!')\n"
                        "hello.close()",
                        main_namespace);

注意

    我已经安装了 python3.6-dev 我能够使用相同的构建参数和包含指令运行 this 完整的list 错误 我使用的是 Ubuntu 16.04

另外:如果我正确理解以下发生的事情:当我将我的构建与 lboost_python 链接时,它会使用一些函数 PyInt_TypePyString_FromString。它有关于它们的返回类型和输入参数的信息,但不是它们的真实定义,即函数体,它是在其他一些库(在我的情况下是 python 库)中定义的,我必须告诉链接器这个库要包含在建造。我的理解正确吗?如果是,那么为什么链接 python3.6m 没有帮助?

【问题讨论】:

如果你完全删除 Qt 会怎样,它会起作用吗? @UlrichEckhardt 不,它没有。我用g++ example.cpp -L/usr/include -lpython3.6m -L/usr/include/boost/python -lboost_python -I/usr/include/boost/python/ -I/usr/include/python3.6m 编译它,它给出了完全相同的错误。 好吧,然后编辑你的问题,让它更接近一个实际最小的例子。 【参考方案1】:

boost_python 可能指向 python 2.7 版本,例如在 debian stretch 中(应该有与 ubuntu 16.04 中类似的包)。

> cd /usr/lib/x86_64-linux-gnu
> ls -l libboost_python*.*
... libboost_python-py35.a
... libboost_python-py27.a
... libboost_python.a -> libboost_python-py27.a
... libboost_python-py27.so.1.55.0
... libboost_python-py27.so -> libboost_python-py27.so.1.62.0
... libboost_python.so -> libboost_python-py27.so
... libboost_python-py35.so.1.62.0
... libboost_python-py35.so -> libboost_python-py35.so.1.62.0

我猜该库的 python 3.6 版本可能并不容易获得。如果libboost_python-py35 与python 3.6 不兼容,最简单的选择可能是使用python 3.5,即

-lboost_python-py35

用于动态链接。

【讨论】:

g++ example.cpp -L/usr/lib/x86_64-linux-gnu -llibboost_python-py35.a -L/usr/lib -lpython3.5m -I/usr/include/python3.5m 我试图用它来构建,但它说它找不到-llibboost_python-py35.a,即使我的/usr/lib/x86_64-linux-gnu 文件夹中有它。 @Kamanji 它应该是-lboost_python-py35(或者在静态链接的情况下可能是/usr/lib/x86_64-linux-gnu/libboost_python-py35.a【参考方案2】:

您以错误的顺序链接库。 boost_python 必须在前,python3.6m 必须在后,因为boost_python 依赖于python3.6m

P.S.:这是错误的:-L/usr/include:-L 告诉链接器在哪里可以找到库,但 /usr/include 包含标题,而不是库。你根本不需要它,但如果你需要它,它是-L/usr/lib 或类似的。

【讨论】:

我尝试使用`g++ example.cpp -L/usr/include/boost/python -lboost_python -lpython3.6m -I/usr/include/python3.6m`构建,但得到了相同的结果错误。 @Kamanji: -L/usr/include/boost/python 没有意义,-I/usr/include/python3.6m 也没有意义。第一个声称指定了一个库路径,但它是一个头路径;第二个声称指定头路径,但包含库名称的一部分。

以上是关于链接 Boost.python 示例的问题的主要内容,如果未能解决你的问题,请参考以下文章

构建引用 Boost 的 Python 包时的 LNK1120

编译时与 Boost.python 链接错误

如何使用 Boost.Python 定义 Python 元类?

Boost.Python.ArgumentError:python str 未转换为 std::string

C++ Boost Python numpy 数组初始化

Boost.Python 创建的 dll 无法导入(遵循 Boost Python 的 QuickStart)