链接 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_python
和 python3.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_Type
、PyString_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 定义 Python 元类?