【问题标题】:Intel compiler - Can't install packages in R that require eventloop.h英特尔编译器 - 无法在 R 中安装需要 eventloop.h 的包
【发布时间】:2014-02-28 20:56:01
【问题描述】:

似乎我无法在 R 中安装任何需要编译任何文件的包。 eventloop.h

我使用英特尔编译器对 R 进行了自定义安装,并链接到英特尔 MKL BLAS 库。

这是我得到的具体错误:

> install.packages("setwidth")
Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
Selection: 77
trying URL 'http://streaming.stat.iastate.edu/CRAN/src/contrib/setwidth_1.0-3.tar.gz'
Content type 'application/x-gzip' length 3789 bytes
opened URL
==================================================
downloaded 3789 bytes

* installing *source* package ‘setwidth’ ...
** package ‘setwidth’ successfully unpacked and MD5 sums checked
** libs
icc -std=c99 -I/usr/local/lib/R/include -DNDEBUG  -I/usr/local/include    -fpic  -O3 -ipo -xavx -openmp  -c setwidth.c -o setwidth.o
In file included from setwidth.c(4):
/usr/local/lib/R/include/R_ext/eventloop.h(73): error: identifier "fd_set" is undefined
  extern InputHandler *getSelectedHandler(InputHandler *handlers, fd_set *mask);
                                                                  ^
... more of the same ...

                  ^

compilation aborted for setwidth.c (code 2)
make: *** [setwidth.o] Error 2
ERROR: compilation failed for package ‘setwidth’
* removing ‘/usr/local/lib/R/site-library/setwidth’

The downloaded source packages are in
    ‘/tmp/RtmpXuQs4W/downloaded_packages’
Warning message:
In install.packages("setwidth") :
  installation of package ‘setwidth’ had non-zero exit status

请告诉我您可能需要的任何其他信息,以帮助我解决此问题。

编辑:

我尝试添加

R_XTRA_CFLAGS = -I /src/include -I /src/include/sys 

到我的 ~/.R/Makevars 文件,因为 fd_set 是在 /sys/select.h 中定义的

编辑:

所以这个问题不会出现在每个包中,只有需要某些 R 标头的包才会出现。到目前为止,我只对某个作者编写的包有问题(将 R 与 VIM 集成所需的所有包,http://www.lepem.ufc.br/jaa/vim-r-plugin.html)有人有什么想法吗?

编辑:

似乎是编译器问题:

gcc -I /usr/include/ -I /usr/local/lib/R/include/ -c setwidth.c

不过有效

icc -std=c99 -I /usr/include -I /usr/local/lib/R/include  -O3 -ipo -xavx -openmp -c setwidth.c

没有

【问题讨论】:

  • 你在哪里安装了 R 头文件?
  • 在哪里指定,我想我没有指定
  • 取决于您的操作系统。您是否按照R Installation and Administration 中的说明进行操作,特别是 6.3 和附录 A?
  • @JoshuaUlrich 我在 ubuntu 操作系统上。我仍然无法弄清楚问题出在哪里,我已经查看了 R 安装和管理文档,还有其他提示/想法吗?
  • 嗯,这个问题似乎只影响这个包(到目前为止)我能够安装 ggplots2。我已经联系了作者,但我知道是否会去任何地方

标签: r compiler-errors icc intel-mkl


【解决方案1】:

让我们稍微备份一下:

  1. Ubuntu 与 R 一起使用非常广泛。

  2. 你可以只安装prebuilt current binary from CRAN

  3. 然后您可以添加 MKL,因为 BLAS 由于其标准接口而可以互换。 (这经常被误解;有关详细信息,请参阅我的gcbd vignette

  4. 通过使用更常见的设置,您可以轻松编译包,或获取预构建的包。

  5. 然后您可以更仔细地研究一下您的英特尔 icc 设置。

目前它已损坏,您可以保留这两部分。

编辑:为了更清楚,在标准的 Ubuntu 系统上使用 CRAN 关闭的 Ubuntu 二进制包:

edd@max:~$ install.r setwdith
Warning message:
package ‘setwdith’ is not available (for R version 3.0.2) 
edd@max:~$ install.r setwidth
trying URL 'http://cran.r-project.org/src/contrib/setwidth_1.0-3.tar.gz'
Content type 'application/x-gzip' length 3789 bytes
opened URL
==================================================
downloaded 3789 bytes

* installing *source* package ‘setwidth’ ...
** package ‘setwidth’ successfully unpacked and MD5 sums checked
** libs
ccache gcc-4.8 -I/usr/share/R/include -DNDEBUG      -fpic  -O3 -g0 -Wall -pipe -pedantic -std=gnu99  -c setwidth.c -o setwidth.o
ccache gcc-4.8 -shared -o setwidth.so setwidth.o -L/usr/lib/R/lib -lR
installing to /usr/local/lib/R/site-library/setwidth/libs
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (setwidth)

The downloaded source packages are in
    ‘/tmp/downloaded_packages’
edd@max:~$ 

这里的install.r 是我的littler 包中的脚本;编译器设置是我通过(真棒)ccache 工具包装的默认设置。

【讨论】:

  • 感谢您的想法。我非常熟悉如何设置 R。我试图通过使用 intel MKL 和 intel 编译器从我的构建思想中挤出更多性能。我不太清楚你的建议:你认为我应该忘记英特尔编译器吗?
  • 没有。我建议三件事。 1)通过简化进行调试(但无论如何,您在这里找到了有罪的一方,这里是 icc。2)只需交换它们即可使用 BLAS,请参阅我的小插图了解详细信息——无需为此重新编译 R。 3) Intel icc 不错,不过据说最近的 gcc/g++ 已经缩小了差距; R Inst + Admin 手册也有关于使用 icc 的详细信息。
  • 感谢您的建议。问题最终围绕一个特定的环境变量(见我的回答),它不需要那么多调试:)
【解决方案2】:

不确定这是否是一个合适的解决方案,但当我窥视 /usr/local/lib/R/include/R_ext/eventloop.h 内部时,我在包含语句中看到以下内容:

#ifndef R_EXT_EVENTLOOP_H
#define R_EXT_EVENTLOOP_H

#ifndef NO_C_HEADERS
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h>    /* for fd_set according to recent POSIX */
#endif
/* NOTE: Needed at least on FreeBSD so that fd_set is defined. */
# include <sys/types.h>
#endif

如您所见,sys/select.h 仅包含在某些变量 HAVE_SYS_SELECT_H 的条件下。我拿出了这个条件语句:

#ifndef R_EXT_EVENTLOOP_H
#define R_EXT_EVENTLOOP_H

#ifndef NO_C_HEADERS
# include <sys/select.h>    /* for fd_set according to recent POSIX */
/* NOTE: Needed at least on FreeBSD so that fd_set is defined. */
# include <sys/types.h>
#endif

并且包编译(和安装)成功。如果有人对为什么这个特定变量 HAVE_SYS_SELECT_H 没有正确定义有任何见解,请告诉我。

【讨论】:

    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多