我正在尝试编译 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
主要.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 库),我必须告诉链接器关于这个库的信息将它包含在 build 。我的理解正确吗?如果是,那么为什么针对 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 不兼容,即
-lboost_python-py35
用于动态链接。
关于python - 链接 Boost.python 示例的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48718533/