链接问题 boost::p ython::numpy.
Trouble with linking boost::python::numpy
我写了一个小例子来说明发生了什么。
my_test.cpp
#include <iostream>
#include <boost/python/numpy.hpp>
namespace np = boost::python::numpy;
int my_Foo()
{
Py_Initialize();
np::initialize();
std::cout << "hellon";
return 0;
}
BOOST_PYTHON_MODULE(my_test)
{
using namespace boost::python;
def("my_Foo", my_Foo);
}
py_test.py
import my_test as t
t.my_Foo();
我用命令编译所有内容:
g++ -shared -fPIC -o my_test.so my_test.cpp -lboost_python -lpython2.7 -I/usr/include/python2.7
我收到此错误:
ImportError: /home/my_test.so: undefined symbol: _ZN5boost6python5numpy10initializeEb
当我评论这一行时,它有效
//np::initialize();
我不知道如何解决它。我在论坛上读过类似的问题,但没有一个解决方案帮助我。我尝试了更新提升,更新python,链接库,在编译过程中将生成的模块放在其他模块之前 - 没有任何帮助。我将不胜感激任何帮助。
关于仿生-lboost_python
是不够的。你错过了-lboost_numpy
.
在 Xenial 上,您还找不到预构建的库:
sudo apt -y install libpython2.7-dev libboost-python-dev
git clone https://github.com/ndarray/Boost.NumPy
cd Boost.Numpy
mkdir build
cd build
cmake ..
make
sudo make install
将代码中的boost/python/numpy.hpp
替换为boost/numpy.hpp
也namespace np = boost::python::numpy
替换为namespace np = boost::numpy
; |
g++ -o test5.so -fPIC -shared test5.cpp -lboost_python -lboost_numpy -I/usr/local/include -I/usr/include/x86_64-linux-gnu/python2.7/ -I/usr/include/python2.7
enter code here
~> LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64 ldd test5.so
linux-vdso.so.1 => (0x00007ffe9cd36000)
libboost_python-py27.so.1.58.0 => /usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0 (0x00007ffba47bd000)
libboost_numpy.so => /usr/local/lib64/libboost_numpy.so (0x00007ffba45a2000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ffba4216000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ffba3ffe000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffba3c34000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ffba3a17000)
libpython2.7.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 (0x00007ffba3489000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ffba3180000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffba4c11000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ffba2f66000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffba2d62000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007ffba2b5f000)
我在链接 python3 或更高版本时也遇到了这个问题。 在这种情况下,添加这些链接选项会有所帮助:
-lboost_python3 -lboost_numpy3
显然没有找到-lboost_numpy
,因此我们需要使用-lboost_numpy3
我设法通过以下命令编译 OP 给出的代码与 Boost 1.71.0 和 Python 3.5 链接:
g++ -o my_test.so -fPIC -shared my_test.cpp
-I/usr/include/python3.5 `# for pyconfig.h`
-L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu `# for libpython3.5 or libpython3.5m`
-lpython3.5
-I/usr/local/boost_1_71_0/include `# for Boost header files`
-L/usr/local/boost_1_71_0/lib `# for Boost binary files`
-lboost_python35 -lboost_numpy35
在我的Linux系统(Debian Stretch(上,Boost库被放置在/usr/local/boost_1_71_0
中。
我不确定你的Python版本和Boost版本。 我的版本:python2.7
boost1.67
如果cmakeList.txt
为:
link_libraries(${Pangolin_LIBRARIES}
boost_python
boost_numpy
assimp
util)
所以把它改成link_libraries(${Pangolin_LIBRARIES}
boost_python27
boost_numpy27
assimp
util)
因为:Boost.Python 库名称现在包含 Python 版本后缀。因此,使用 Python 2.7 编译的变体将生成库名称boost_python27和boost_numpy27等,从而可以相邻托管多个 Python 版本的变体。(从这里开始( 您可以检查速推库路径。
- C++返回 Numpy 数组的 Python 扩展模块
- 相当于 pybind11 中的 boost::p ython py::scope().attr()
- numpy C API 中的import_array如何工作?
- 如何使用C++范围来实现numpy.ndindex?
- 传递 boost::p ython::numpy::ndarray 作为 boost::p ython 函数的(默认或非
- 在 Cython 中将C++向量转换为 numpy 数组,而无需复制
- Boost Python Numpy - 要初始化的未定义引用
- 如何通过 cython 将 numpy 数组列表传递给 C++
- boost::p ython:PyErr_Fetch始终返回 NULL 回溯
- numpy.load 给出 ValueError: descr 不是有效的 dtype 描述符:
- Pybind11 默认参数 numpy 数组或 None
- C++ - 与 Numpy 中的矢量版本相比,Argsort 效率低的矢量版本实现
- 如何通过 boost::p ython 重命名构造函数的关键字参数
- 如何使用 CMake 链接"numpy/arrayobject.h"
- 相当于numpy.exexpand_dims()和numpy.contenate()的C++
- Pybind11:在C++中使用Pybind11转换numpy数组的问题
- 使用SWIG将numpy数组元素(int)传递给c++int
- 如何在 swig 中使用 numpy.i?
- 链接问题 boost::p ython::numpy.
- 如何从 boost::p ython 返回 numpy.array