未定义符号错误通常由以下两种情况之一引起:
- 在构建过程中不正确的链接,或者
- 用于构建二进制文件或库的环境与运行它的环境不匹配。
不正确的链接
如果您正在构建 pygrib 模块本身,请确保正确链接所需的库依赖项,并且顺序正确。根据缺少的符号名称,__svml_round2_mask
我猜你pygrib.so
是用英特尔icc
C 编译器编译的,需要链接到包含 SVML(短向量数学库)函数的数学库。在不了解构建环境的更多细节的情况下很难获得更具体的信息,但是例如,在 linux 上,icc
和gcc
(都调用 GNUld
进行链接)都需要在其命令行上指定该数学库,并且需要在其之后调用它的二进制文件或库。
环境不匹配
如果 pygrib 不是由您构建的(无论是显式构建,还是作为pip
or conda
install 命令的一部分),那么您可能存在环境不匹配。当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
--ignore 开头的未定义符号,它们是由 Python 本身提供的。但在其中,您会希望发现需要哪个特定的库__svml_round2_mask
。仔细查看它的完整路径,以及列出的其他库的完整路径,这可能表明不匹配的来源。
其他建议
- 在您的问题中包含更多细节,例如您的操作系统以及您的安装方式
pygrib
及其依赖项,可能使我们能够提供更具体的建议。
- 如果你的问题的标题更具体,它可能会吸引更多的注意力。
- 你试过其他
pygrib
包吗?Conda-forge 列出了几个;其中之一可能与您的系统匹配。
- 您是否尝试过该
python-eccodes
模块?它似乎是 pygrib 的推荐继任者。
祝你好运,我希望这里有帮助!