尽管在pygrib安装中没有遇到任何错误,但在导入pygrib时遇到了以下错误:
>>> import pygrib
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /python/python-2.7.13/lib/python2.7/site-packages/pygrib.so: undefined symbol: __svml_round2_mask对于什么会导致这个“未定义的符号”错误,有什么建议吗?
发布于 2017-09-11 19:31:14
未定义的符号错误通常是由以下两种原因之一引起的:
不正确链接
如果您正在构建pygrib模块本身,请确保所需的库依赖项正在按正确的顺序正确链接。基于缺少的符号名__svml_round2_mask,我想您的pygrib.so是用Intel icc C编译器编译的,需要链接到包含icc函数的数学库。如果不了解构建环境的更多细节,就很难得到更具体的信息,但例如,在linux上,icc和gcc (它们都将GNU ld称为链接)都需要在它们的命令行中指定这个数学库,并且它需要遵循调用它的二进制或库。
环境失配
如果pygrib不是由您构建的(显式的,或者作为pip或conda安装命令的一部分),那么您可能存在环境不匹配。当您下载的pygrib.so是针对与您安装的库不同的库构建时,就会发生这种情况。理想情况下,所有Python二进制包都是针对一组非常普通的库构建的(例如,用于linux轮子的"manylinux1“容器),这样它们就可以在大多数系统上运行,但有时需要通过特定的优化或针对不常见的库来构建专门的和性能关键的包。如果这些优化或库在生成系统和安装结果包的系统之间不匹配,则可能会导致undefined symbol错误。
尽量减少这种情况的一种方法是在可能的情况下不要混合和匹配包存储库。也就是说,如果您正在使用Anaconda,只需从Anaconda中提取包。我知道,不总是可能的,对吧?
如果您在linux上,有时可以通过使用ldd命令找出不匹配的位置,例如:
$ ldd -r /python/python-2.7.13/lib/python2.7/site-packages/pygrib.so
您将看到一堆以Py或_Py开头的未定义符号--忽略它们,它们是由Python本身提供的。但是在这些代码中,您可能会发现哪个特定的库需要__svml_round2_mask。仔细查看它的完整路径,以及列出的其他库的完整路径,这可能表明错配的来源。
其他建议
pygrib及其依赖项,可能会使我们能够提供更具体的建议。pygrib包吗?Conda伪造列出了几个;其中一个可能与您的系统相匹配。python-eccodes模块了吗?它似乎是吡咯烷酮的推荐接班人。祝你好运,我希望这里有帮助!
https://stackoverflow.com/questions/46148672
复制相似问题