【问题标题】:Build R package in Windows under CygwinCygwin下在Windows中构建R包
【发布时间】:2017-06-10 16:46:45
【问题描述】:

当尝试在 Cygwin 下从 Win10 上的源代码将 R 包 dplyr 更新到 0.7.0 时(dplyr 0.7.0 的 Windows 二进制文件不可用。此外,我的 R 安装不在 Cygwin 下,而我的 R 安装来自二进制文件)。但是当我运行时

R CMD INSTALL dplyr_0.7.0.tar.gz

看到以下错误:

* installing to library 'C:/Program Files/R/R-3.4.0/library'
* installing *source* package 'dplyr' ...
** package 'dplyr' successfully unpacked and MD5 sums checked
** libs
c:/Rtools/mingw_64/bin/g++  -I"C:/PROGRA~1/R/R-34~1.0/include" -DNDEBUG    -I../inst/include -DCOMPILING_DPLYR -DRCPP_USING_UTF8_ERROR_STRING -I"C:/Program Files/R/R-3.4.0/library/Rcpp/include" -I"C:/Program Files/R/R-3.4.0/library/BH/include" -I"C:/Program Files/R/R-3.4.0/library/bindrcpp/include" -I"C:/Program Files/R/R-3.4.0/library/plogr/include"   -I"d:/Compiler/gcc-4.9.3/local330/include"     -O2 -Wall  -mtune=core2 -c   RcppExports.cpp -o RcppExports.o
/bin/sh: c:/Rtools/mingw_64/bin/g++: No such file or directory
make: *** [C:/PROGRA~1/R/R-34~1.0/etc/x64/Makeconf:215: RcppExports.o]    Error 127
Warning: running command 'make -f "Makevars.win" -f "C:/PROGRA~1/R/R -34~1.0/etc/x64/Makeconf" -f "C:/PROGRA~1/R/R-34~1.0/share/make/winshlib.mk" SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' SHLIB="dplyr.dll" WIN=64 TCLBIN=64 OBJECTS="RcppExports.o address.o api.o arrange.o between.o bind.o combine_variables.o distinct.o filter.o group_by.o group_indices.o hybrid.o hybrid_count.o hybrid_debug.o hybrid_in.o hybrid_minmax.o hybrid_nth.o hybrid_offset.o hybrid_simple.o hybrid_window.o init.o init_register.o join.o join_exports.o mutate.o rlang-export.o select.o set.o slice.o summarise.o test.o utils.o window.o"' had status 2
ERROR: compilation failed for package 'dplyr'
* removing 'C:/Program Files/R/R-3.4.0/library/dplyr'
* restoring previous 'C:/Program Files/R/R-3.4.0/library/dplyr'

错误原因是 R(使用 Rtools 库)在 c:/Rtools/mingw_64/bin/ 下而不是 Cygwin /usr/bin/ 下寻找 g++/gcc 编译器

有没有办法改变 R CMD INSTALL 的默认行为,允许在没有 Rtools 的情况下在 Windows 中从源代码构建 R 包?

谢谢

PS。我觉得这个帖子 how do you use cygwin to compile an R package from source? 是相关的,但似乎 R 安装在 Cygwin 下,这不是我的情况。

PPS。看来我需要更改下定义的变量

R CMD config

有什么想法吗?

【问题讨论】:

  • 您不能使用 cygwin 编译器来构建仅 Windows 的二进制文件
  • 我就是这么想的。阅读与 Windows 相关的 R 文档,有足够多的框可以按原样检查(包括每个包特定的编译细节),现在将 Cygwin 添加到该组合中是不值得的

标签: r cygwin


【解决方案1】:

我不确定最好的解决方案是什么。但是你当然可以通过修改$(R_HOME)/etc/x64/Makeconf 中的 BINPREF 来解决这个问题。 c:/Rtools/mingw_64/bin/ 是默认值。

PS:你几乎可以肯定可以使用 cygwin 编译器来构建 R 包,只要只涉及 C 链接。我在 Visual Studio 下构建了一些我的。

【讨论】:

  • 感谢@DaBookshah,这是设置/修改环境变量的文件,以便在 Windows 下从源代码编译 R 库。假设仅涉及 C 链接的软件包的有限编译,至少有两件事需要进一步探索:1. gcc 版本是否重要(R 使用 v4.9.3 编译,我的 Cygwin 安装是 5.4.0)和 2. Rtools 是否仍然需要?
  • 1. gcc 版本不太可能很重要。据我所知,R 和 R 包之间的所有函数调用都使用 C 链接,这应该没问题。 2. Rtools 可能不是必需的,前提是您可以访问所有标准的东西,例如make、cp、cat、basename 等。不过,我从未亲自测试过这种配置。
  • 再次感谢您的反馈。更新 Makeconf 后,我尝试从源代码更新三个 R 包(DBI、DBItest 和 bindrcpp),因为 Windows 二进制文件不可用。前两个编译,安装和测试成功。但是,在安装 bindrcpp 期间,安装程序会在加载已安装的包时挂起。我在 $(R_HOME)/library/bindrcpp 文件夹中看到更新的文件,还有一个额外的文件夹 00LOCK-bindrcpp,我认为这是安装程序正在工作/测试安装的位置。有趣的是,我看到两个 R 进程在 Windows 任务管理器中运行(续)
  • (续)...虽然,我在 Cygwin 中杀死了 R 安装进程,其中一个进程仍在使用 CPU。当我在 Windows 任务管理器中强制终止这两个进程时,两个文件夹 $(R_HOME)/library/bindrcpp 和 00LOCK-bindrcpp 都被删除了!让我使用最新的可用二进制文件安装 bindrcpp。
  • 我注意到 Makeconf 文件将编译器/链接器指向-I"d:/Compiler/gcc-4.9.3/local330/include"-Ld:/Compiler/gcc-4.9.3/local330/lib-Ld:/Compiler/gcc-4.9.3/local330/lib/x64。从源代码构建 R 包时,这些库如何发挥作用?谢谢
猜你喜欢
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
相关资源
最近更新 更多