在集群上安装 R 包时出现奇怪的 C 编译器错误

Posted

技术标签:

【中文标题】在集群上安装 R 包时出现奇怪的 C 编译器错误【英文标题】:Strange C compiler error when installing R package on a cluster 【发布时间】:2015-06-12 00:55:07 【问题描述】:

-- 我能够解决这个问题,请参阅下面的最后编辑 ---

我正在尝试在我研究所的计算集群上使用 R。对于并行计算问题,我想安装 snow 和 Rmpi​​ 包。所以我下载了 tar.gz 文件并尝试安装 pacakges,对于雪它工作正常,但对于 Rmpi​​ 发生了一些奇怪的事情:

我首先做了什么:

install.packages("/home/myusername/Rpackages/Rmpi_0.6-5.tar.gz", repos = NULL, type = "source", lib = "/home/myusername/Rpackages/")
* installing *source* package ‘Rmpi’ ...
** Paket ‘Rmpi’ erfolgreich entpackt und MD5 Summen überprüft
checking for gcc... gcc -m64 -std=gnu99
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc -m64 -std=gnu99 accepts -g... yes
checking for gcc -m64 -std=gnu99 option to accept ISO C89... none needed
Trying to find mpi.h ...
Cannot find mpi.h header file
Please use --with-mpi=/path/to/mpi or specify the environment variable MPI_ROOT
ERROR: configuration failed for package ‘Rmpi’
* removing ‘/home/myusername/Rpackages/Rmpi’

好的,所以 mpi.h 似乎丢失了,我进行了一些搜索并找到了该怎么做:指定 MPI 库的路径:

> install.packages("/home/myusername/Rpackages/Rmpi_0.6-5.tar.gz", repos = NULL, type = "source", lib = "/home/myusername/Rpackages/", configure.args="--with-mpi=/cm/local/modulefiles/openmpi/gcc/64/1.6.3" )
* installing *source* package ‘Rmpi’ ...
** Paket ‘Rmpi’ erfolgreich entpackt und MD5 Summen überprüft
checking for gcc... gcc -m64 -std=gnu99
checking whether the C compiler works... no
configure: error: in `/tmp/Rtmp9qZ8QA/R.INSTALLad327c257ce2/Rmpi':
configure: error: C compiler cannot create executables
See `config.log' for more details

ERROR: configuration failed for package ‘Rmpi’
* removing ‘/home/myusername/Rpackages/Rmpi’
Warnmeldung:
In install.packages("/home/myusername/Rpackages/Rmpi_0.6-5.tar.gz",  :
  Installation des Pakets ‘/home/myusername/Rpackages/Rmpi_0.6-5.tar.gz’ hatte Exit-Status ungleich 0

所以现在没有 mpi.h 错误,但 C 编译器似乎无法工作,虽然它之前有,我只更改了 install.packages 函数中的 mpi 选项。

这里出了什么问题,我该如何安装软件包?


编辑 2:经过一些帮助后,我想出了如何找到 mpi 文件所在的位置并执行此操作:

install.packages("/home/myusername/Rpackages/Rmpi_0.6-5.tar.gz", repos = NULL, type = "source", lib = "/home/myusername/Rpackages/", configure.args=c("--with-Rmpi-libpath=/usr/mpi/gcc/openmpi-1.6.3/lib64/","--with‌​-Rmpi-type=OPENMPI", "--with-Rmpi-include=/usr/mpi/gcc/openmpi-1.6.3/include/") )

但是,这仍然不起作用,我收到以下错误:

* installing *source* package ‘Rmpi’ ...
** Paket ‘Rmpi’ erfolgreich entpackt und MD5 Summen überprüft
checking for openpty in -lutil... no
checking for main in -lpthread... no
configure: creating ./config.status
config.status: creating src/Makevars
** libs
gcc -m64 -std=gnu99 -I/usr/include/R -DNDEBUG -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -I/usr/mpi/gcc/openmpi-1.6.3/include/  -DMPI2 -DOPENMPI -I/usr/local/include    -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic  -c Rmpi.c -o Rmpi.o
Rmpi.c: In Funktion »mpi_bcast«:
Rmpi.c:605:2: Fehler: unbekannter Typname: »R_xlen_t«
make: *** [Rmpi.o] Fehler 1
ERROR: compilation failed for package ‘Rmpi’

编辑 3:我想出了一个解决我的问题的方法,由于信息不完整,我猜这里没有人能找到。在集群上,R 仅安装在 2.15.2 版本中,但 Rmpi​​ 0.6-5 是为 R 3.0.0 或更高版本构建的。 Rmpi 包中的 R 版本依赖指定错误。我下载了一个旧版本(Rmpi 0.6-1)并且能够安装这个。

【问题讨论】:

您确定文件夹/cm/local/modulefiles/openmpi/gcc/64/1.6.3/ 包含整个 MPI 安装吗?通常 MPI 不会安装到模块文件配置中。运行locate mpi.hlocate mpirun,找到实际安装MPI的目录。 不,我不确定哪个文件夹实际包含 MPI 安装,我也不确定我是否可以访问此文件夹。 locate mpi.hlocate mpirun 都不回馈任何东西 运行 module list 然后查找对应于为 gcc 编译的 openmpi 1.6.3 的条目(例如 openmpi/1.6.3)。选择该条目并运行module load openmpi/1.6.3(模块名称可能不同)。然后which mpirun 应该会告诉你 openmpi 的安装位置。 所以我用module available找到了这个:openmpi/gcc/64/1.6.3,然后通过module load /cm/local/modulefiles/openmpi/gcc/64/1.6.3 加载它,然后在module list之后也显示了它。 which mpirun 回馈/usr/mpi/gcc/openmpi-1.6.3/bin/mpirun,所以我尝试在Rmpi 包安装中使用它:install.packages("/home/myusername/Rpackages/Rmpi_0.6-5.tar.gz", repos = NULL, type = "source", lib = "/home/myusername/Rpackages/", config.args = "--with-mpi=/usr/mpi/gcc/openmpi-1.6.3/bin/mpirun"),编译器现在可以工作,但同样,找不到mpi.h 不知何故我无法编辑我以前的评论。所以我意识到可能出了什么问题,我这样做了:install.packages("/home/myusername/Rpackages/Rmpi_0.6-5.tar.gz", repos = NULL, type = "source", lib = "/home/myusername/Rpackages/", configure.args=c("--with-Rmpi-libpath=/usr/mpi/gcc/openmpi-1.6.3/lib64/","--with-Rmpi-type=OPENMPI", "--with-Rmpi-include=/usr/mpi/gcc/openmpi-1.6.3/include/") ),但是,我收到以下错误:Rmpi.c: In Funktion »mpi_bcast«: Rmpi.c:605:2: Fehler: unbekannter Typname: »R_xlen_t« make: *** [Rmpi.o] Fehler 1 ERROR: compilation failed for package ‘Rmpi’ 【参考方案1】:

我在 Ubuntu 中安装了 libopenmpi-dev,并尝试在 Rstudio 中安装 Rmpi​​。有效!

【讨论】:

【参考方案2】:

问题是如果找不到库,它就无法编译 R-package。解决办法是

$ sudo apt-get install libopenmpi-dev

然后重新打开 R,安装应该可以工作了

R> install.packages('Rmpi')

【讨论】:

以上是关于在集群上安装 R 包时出现奇怪的 C 编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010 在编译 C++/CLI 项目时出现奇怪的错误

使用 conda 在 Windows 上构建 Python 包时出现奇怪的“拒绝访问”错误

在 Python 中安装 Psyco 时出现奇怪的错误

python安装大型包时出现错误Unable to find vcvarsall.bat

在 Windows 上的 rStudio 上将 r markdown 编织为 pdf 时出现错误 43

在 R 中为 keras 调用 fit() 时出现奇怪的错误