[英]Issues linking Boost.python example
我正在尝试编译此示例,但收到有关undefined reference to PyInt_Type/PyString_FromString/PyNumber_Divide
等的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);
}
注意事项 :
另外 :如果我理解正确的话以后的事发生了:当我和lboost_python它使用了一些功能链接我的生成PyInt_Type
, PyString_FromString
。 它具有关于它们的返回类型和输入参数的信息,但是没有关于它们的实际定义(即函数体)的信息,这些信息是在其他库中定义的(在我的情况下是python库),我必须告诉链接程序有关此库的信息,以将其包含在其中建立。 我的理解正确吗? 如果是,那为什么对python3.6m
链接没有帮助?
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
用于动态链接。
您以错误的顺序链接库。 因为boost_python
依赖于python3.6m
,所以boost_python
必须排在最前面,而python3.6m
必须boost_python
python3.6m
。
PS:这是错误的: -L/usr/include
: -L
告诉链接器在哪里可以找到库,但是/usr/include
包含标头,而不是库。 您根本不需要它,但如果需要,它是-L/usr/lib
或类似名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.