如何使用选项 -std=c99 安装 R 包



我在安装 plyr R 软件包时遇到问题,并收到以下错误:

Installing package into '/home/mousavian/R/x86_64-pc-linux-gnu-library/3.2'
(as 'lib' is unspecified)
* installing *source* package 'plyr' ...
** package 'plyr' successfully unpacked and MD5 sums checked
** libs
g++ -I/share/apps/R/lib64/R/include -DNDEBUG  -I/usr/local/include -I"/home/mousavian/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include"   -fpic  -g -O2  -c RcppExports.cpp -o RcppExports.o
gcc -I/share/apps/R/lib64/R/include -DNDEBUG  -I/usr/local/include -I"/home/mousavian/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include"   -fpic  -g -O2  -c loop_apply.c -o loop_apply.o
loop_apply.c: In function 'loop_apply':
loop_apply.c:15:3: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
   for(int i = 0; i < n1; i++) {
   ^
loop_apply.c:15:3: note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code
make: *** [loop_apply.o] Error 1
ERROR: compilation failed for package 'plyr'
* removing '/home/mousavian/R/x86_64-pc-linux-gnu-library/3.2/plyr'
Warning message:
In install.packages("R packages/plyr_1.8.3.tar.gz", repos = NULL) :
  installation of package 'R packages/plyr_1.8.3.tar.gz' had non-zero exit status

尝试通过 install.packages 命令从源安装 R 包时如何使用 -std=c99 选项?

谢谢

先尝试 C11

编译器错误告诉您选择 C99C11。 因此,除非您有意编译旧代码,否则请先尝试 C11。如果旧版 C99 不起作用,您可以随时尝试。

使用withr::with_makevars

编辑单个包 Makevar 或为每个不直接从源代码编译的包协调对 include/lib 目录的全局更改,对于未来来说不是一个令人满意的策略。别这样!编辑 R 的make配置的一个很好的替代方法是使用 withr::with_makevars 仅为安装命令操作Makevars

library(withr)
with_makevars(c(PKG_CFLAGS = "-std=c11"), 
              install.packages("plyr", repos = NULL, type = "source"), 
              assignment = "+=")

另外,您可能已经安装了withr,因为它是devtools依赖项。

如果尚不存在,请在$HOME中创建一个目录(在您的情况下/home/mousavian/.R)。在里面,创建一个Makevars文件(无扩展名)。使用您喜欢的编辑器编辑此文件并编写:

CC = gcc -std=c99

然后,保存它并在启动 R 后,只需运行

install.packages("plyr", dependencies = TRUE)

它应该用gcc -std=c99编译。

默认/etc/R/Makeconf包括CC = gcc -std=gnu99(R 3.3.2,可能还有大多数或所有其他最新版本,尽管我认为正在进行的开发版本跳跃到21世纪)

接受的答案可能很有效,但不是R默认的。在没有其他选项的情况下设置 CC=gcc 将删除此默认值,这是出现此错误的另一个原因。最好不要使用默认值,除非您知道自己在做什么。

作为附录,为了可能为某人节省几分钟:在 Rstudio 服务器上将 R 更新到 3.3.2 后,我遇到了类似的问题(我无法控制),但使用 g++。g++ 的编译器选项可以添加到Makevars中,如下所示:

CXX1XSTD = -std=gnu++11

(我需要编译的包需要 gnu++11)

最新更新