【问题标题】:Trouble with linking boost::python::numpy链接 boost::python::numpy 的问题
【发布时间】:2018-12-04 21:07:06
【问题描述】:

我写了一个小例子来说明发生了什么。

my_test.cpp

#include <iostream>
#include <boost/python/numpy.hpp>
namespace np = boost::python::numpy;
int my_Foo() 
{
    Py_Initialize();
    np::initialize();
    std::cout << "hello\n";
    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();

我不知道如何解决它。我在论坛上读过类似的问题,但没有一个解决方案对我有帮助。我尝试了更新 boost、更新 python、链接库、在编译期间将生成的模块放在其他模块之前 - 没有任何帮助。如有任何帮助,我将不胜感激。

【问题讨论】:

    标签: python c++ numpy boost undefined-symbol


    【解决方案1】:

    我设法通过以下命令编译并链接 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

    【讨论】:

      【解决方案2】:

      我不确定你的 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 版本的变体。(from here) 你可以检查你的 boost 库路径。

      【讨论】:

        【解决方案3】:

        我在为 python3 或更高版本链接时也遇到了这个问题。 在这种情况下,帮助添加这些链接选项:

        -lboost_python3 -lboost_numpy3

        显然没有找到-lboost_numpy,因此我们需要使用-lboost_numpy3

        【讨论】:

          【解决方案4】:

          关于仿生 -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)
          

          【讨论】:

          • 我试过但我得到错误:/usr/bin/ld: 找不到 -lboost_numpy
          • 你在什么系统上?如果是 debian 风格:sudo apt -y install libboost-numpy-dev
          • Ubuntu 16.04.4 LTS (Xenial Xerus)
          • 我收到错误:无法找到软件包 libboost-numpy-dev
          • 这有点棘手,需要访问 16.04。在从科隆到柏林的火车上,通过 iPhone 上的 openvpn / ssh 做到了。生活变得如此精彩。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-23
          • 2012-11-26
          • 1970-01-01
          • 2021-10-19
          相关资源
          最近更新 更多