我已成功安装pyopencl,但出现导入错误。我被困在这里,无法进一步发展。任何帮助将非常感激

ImportError跟踪(最近一次通话)
在()中

  5 from __future__ import division

  6 import numpy as np

----> 7导入pyopencl
  8 import pyopencl.array

  9 import math, time

/home/highschool/anaconda2/lib/python2.7/site-packages/pyopencl-2016.2-py2.7-linux-x86_64.egg/pyopencl/ init .py in()
32
 33 try:

---> 34将pyopencl.cffi_cl导入为_cl
 35 except ImportError:

 36     import os

()中的/home/highschool/anaconda2/lib/python2.7/site-packages/pyopencl-2016.2-py2.7-linux-x86_64.egg/pyopencl/cffi_cl.py
 37 from pytools import memoize_method

 38

---> 39从pyopencl._cffi导入ffi作为_ffi
 40 from .compyte.array import f_contiguous_strides, c_contiguous_strides

 41

ImportError:/home/highschool/anaconda2/lib/python2.7/site-packages/pyopencl-2016.2-py2.7-linux-x86_64.egg/pyopencl/_cffi.so:未定义的符号:_ZTVNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEE

最佳答案

问题是libstdc++中的dual ABI和gcc5.1的std::stringstd::list。 Anaconda现在安装libstdc++.so.6.0.19(大概是因为他们添加了带有C++库的Python软件包)from gcc 4.8.3 and pre dual ABI,其中Ubuntu 16.04附带了gcc 5.4和libstdc++.6.0.21。当您构建pyopencl时,它会针对您的系统libstdc++构建并链接,但是当您尝试导入pyopencl时,它会与Anaconda动态链接并无法找到符号。

通过将-D_GLIBCXX_USE_CXX11_ABI=0添加到pyopencl CXXFLAGS中的siteconf.py列表中,应该可以解决此问题。这解决了std::string问题,但缺少其他符号:

ImportError: /home/cryan/anaconda3/lib/python3.6/site-packages/pyopencl-2016.2.1-py3.6-linux-x86_64.egg/pyopencl/_cffi.abi3.so: undefined symbol: _ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEEPFvvE

您的选择是:
  • 从Anaconda(conda install gcc)安装gcc并使用它构建pyopencl。不幸的是,如果您的PATH上有Anaconda,那么您将在所有地方使用它们的gcc。
  • 只需删除/重命名libstdc++中的~/anaconda3/lib:cd ~/anaconda3/lib; mv libstdc++.so libstdc++.annoying; mv libstdc++.so.6 libstdc++.annoying.6即可。 Python模块将在您的系统中找到一个应该向后兼容的模块。
  • 08-19 22:22