boost_python和来自anaconda的python 3.5-(少数)未定义的引用
boost_python with python 3.5 from anaconda - (few) undefined references
升压:1.60.0
python:3.5.0.1
(来自anaconda)
示例代码:
#include <iostream>
#include <boost/python.hpp>
#include <Python.h>
namespace py = boost::python;
int main()
{
// Must be called before any boost::python functions
Py_Initialize();
// import the main module
py::object main_module = py::import("__main__");
// load the dictionary object out of the main module
py::object main_namespace = main_module.attr("__dict__");
// run simple code within the main namespace using the boost::python::exec
// function
py::exec("print ('Hello, world')", main_namespace);
// any valid Python will execute
py::exec("print ('Hello, world')[3:5]", main_namespace);
}
编译为:g++ -std=c++11 test.cpp -o test.o -I/home/user/anaconda3/pkgs/python-3.5.1-0/include/python3.5m/ -L/home/user/anaconda3/pkgs/python-3.5.1-0/lib/python3.5/config-3.5m -lpython3.5m -pthread -lutil -ldl -lboost_python3
输出:
//usr/local/lib/libboost_python3.so: undefined reference to `PyString_AsString'
//usr/local/lib/libboost_python3.so: undefined reference to `PyInt_Type'
//usr/local/lib/libboost_python3.so: undefined reference to `PyString_FromStringAndSize'
//usr/local/lib/libboost_python3.so: undefined reference to `PyString_FromString'
//usr/local/lib/libboost_python3.so: undefined reference to `PyString_FromFormat'
//usr/local/lib/libboost_python3.so: undefined reference to `PyInt_FromLong'
//usr/local/lib/libboost_python3.so: undefined reference to `PyInt_AsLong'
//usr/local/lib/libboost_python3.so: undefined reference to `PyString_Type'
在此之前,我也遇到了其他链接器错误,我链接的是2.7版本的python。我用3.5版本构建了boost_python
。
我理解,这些功能实际上不适用于3.5;不知道它们在哪里被使用。
相反,pl发现如下:
:~/$ nm /usr/local/lib/libboost_python3.so |grep "PyString"
U PyString_AsString
U PyString_FromFormat
U PyString_FromString
U PyString_FromStringAndSize
U PyString_Type
:~/$ nm /usr/local/lib/libboost_python3.so |grep "PyInt"
U PyInt_AsLong
U PyInt_FromLong
U PyInt_Type
如何简单地"继续"?
事实上,我尝试在C++文件中定义这些函数,因为我完全知道我不会调用这些函数,但它不起作用。我知道这是一种有趣的方式。。。,但为了给你一个想法,我想"继续前进",我提到了它。
我认为您的libboost_python3.对于python 2.7或python 3.1之前的版本也是如此,因为它指的是例如在python 3.1、3.2、3.3、3.4或3.5中不可用的PyString_AsString
(基于debian包中库中的符号)。
nm -D /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0|grep PyString_AsString
0000000000112120 T PyString_AsString
0000000000111fd0 T PyString_AsStringAndSize
和python 3.4(与3.5相同)
nm -D /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0 |grep AsString
000000000017ea10 T PyByteArray_AsString
000000000017f680 T PyBytes_AsString
0000000000180cf0 T PyBytes_AsStringAndSize
相关文章:
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- Pybind11:将元组列表从Python传递到C++
- 如何在c++中使用引用实现类似python的行为
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 递归列出所有目录中的C++与Python与Ruby的性能
- IPC使用多个管道和分支进程来运行Python程序
- 从python中调用C++函数并获取返回值
- Python 3.7 和 excess_args 的 SWIG 问题
- Python中的for循环与C++有何不同
- 使用Pybind11向Python公开Eigen::张量
- Python str to C++ to Python str
- 如何使用Python从C++中读取谷物序列化数据
- OpenMP:并行更新数组总是需要减少数组吗
- 如何在C++中使用pybind11加载一个pickle python列表
- 如何在c++中使用system()来运行包含空格的python脚本
- python集合的C++等价物是什么.计数器
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 从python调用openMP共享库时,未定义opnMP函数
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- boost_python和来自anaconda的python 3.5-(少数)未定义的引用