使用Boost/Python时出现未定义符号

6
使用Boost 1.63.0,我编写了以下代码:
vectors.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

这是什么意思,我该如何修复它?
1个回答

10

我的机器没有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
@thestatnoob:你需要同时使用-L/your/path/to/boost-lboost_numpy。你尝试过两个都用了吗?-L指定目录,-l指定文件名。 - John Zwinck
它基本上是有效的。如果我编译为: 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 文件才能使其工作 :( - thestatnoob
1
感谢您指出-Wl,--no-undefined选项,这非常有帮助。 - sfinkens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接