使用未定义的符号安装R包

时间:2015-06-05 12:56:00

标签: linux r intel

我已经安装了R-3.0.1和intel13,我正在尝试安装reshape2版本1.2.2。我正在使用R CMD INSTALL reshape2从源代码安装它,但是我收到以下错误:

Error in dyn.load(file, DLLpath = DLLpath, ...) : 
  unable to load shared object '/sonas/hpcf/apps/R/install/intel13/3.0.1/lib64/R/library/stringi/libs/stringi.so':
  /sonas/hpcf/apps/R/install/intel13/3.0.1/lib64/R/library/stringi/libs/stringi.so: undefined symbol: _intel_fast_memmove
ERROR: lazy loading failed for package ‘reshape2’

所以我认为使用共享的intel库编译stringi.so(正确?),但是reshape2可能无法看到这些库?如何使用定义符号reshape2所需的共享库来安装_intel_fast_memmove

仅供参考,我在RHEL 6.4上安装

1 个答案:

答案 0 :(得分:1)

当系统中存在多个版本的英特尔编译器并用于编译不同的东西时,在动态加载环境(例如R和Python)中会出现这种问题。

如果R本身已经用gcc编译,那么出现这个问题的一种可能性是stringi.so已经用(旧)英特尔编译器v12.1.5编译而另一个库(先前加载到R中)是用较新的英特尔编译的编译器14.0.2。会发生的是第一个库带来了第二个库的一些依赖关系,并且由于依赖关系是为共享库共享的,因此旧的没有加载,并且这些符号的名称发生了一些变化,因此出现了错误。这正是Python,numpy和pytables所发生的事情。

现在,如果您没有加载任何其他库,可能是R本身已经使用不同版本的英特尔编译器构建,但是我很难想象,因为我宁愿期望编译 - stringi.so的时间问题(假设它也需要链接到R本身)。

总而言之,您需要确保在运行时加载的所有库都使用相同版本的编译器进行编译。根据我的经验,混合使用gcc和英特尔编译器比混合使用两个不同版本的英特尔编译器更安全。