【问题标题】:Undefined symbol using Boost/Python使用 Boost/Python 的未定义符号
【发布时间】:2017-07-05 16:43:17
【问题描述】:

使用 Boost 1.63.0,我编写了以下代码:
向量.cpp

/* Boost/Python headers */ 
#include<boost/python/module.hpp>
#include<boost/python/def.hpp>
#include<boost/python/extract.hpp>
#include<boost/python/numpy.hpp>
#include<cmath>

using namespace boost::python;
namespace np = boost::python::numpy;

double eucnorm(np::ndarray axis){

  const int n = axis.shape(0);
  double norm = 0.0;
  for(int i = 0; i < n; i++){
    double A = boost::python::extract<double>(axis[i]);
    norm += A*A;
  }
  return sqrt(norm);
}

BOOST_PYTHON_MODULE(vectors){
  def("eucnorm", eucnorm);
}

我使用以下代码编译了这个:
g++ -shared -fpic -I /usr/include/python2.7 -I /foo/bar/boost_1_63_0 -lboost_python -o vectors.so

导入时出现以下错误:

from vectors import *
ImportError: ./vectors.so: undefined symbol: _ZN5boost6python9converter21object_manager_traitsINS0_5numpy7ndarrayEE10get_pytypeEv

这是什么意思,我该如何解决?

【问题讨论】:

    标签: python c++ boost


    【解决方案1】:

    添加:

    -lboost_numpy -lboost_python 
    

    当你构建 .so 时。

    顺便说一句,如果您想在构建时找出此类问题(而不是在 Python 中尝试import):Force GCC to notify about undefined references in shared libraries

    【讨论】:

    • 我的机器没有 sudo 权限,所以如果我尝试使用 -lboost_numpy(我的机器在 /usr/include 下有 boost 1.60...),那么我会收到 /bin/ld: cannot find -lboost_numpy collect2: error: ld returned 1 exit status 错误。相反,我尝试了-L /foo/bar/boost_1_63_0/lib,但从 Python 返回相同的ImportError
    • @thestatnoob:你需要-L/your/path/to/boost-lboost_numpy。你两个都试过了吗? -L 给出目录,-l 给出文件名。
    • 它在大多数情况下都有效。如果我编译为:g++ vectors.cpp -shared -fpic -Wno-undef -I /usr/include/python2.7 -I /path/to/boost/include/ -L /path/to/boost/lib/ -lboost_numpy -lboost_python -o vectors.so 它工作正常。一个缺点:我需要工作目录中的libboost_numpy 文件才能工作:(
    • 感谢您将我指向-Wl,--no-undefined 选项。很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    相关资源
    最近更新 更多