R 使用 mingw_32 为 64 位架构编译包

R is using the mingw_32 to compile packages for 64-bit architecture

定期 - 我想每当我更新 R - 我在我的 64 位 Windows 机器上从源安装包时遇到问题。

今天我正在尝试使用 devtools::install_github() 安装一个包。安装在我的笔记本电脑上进行得很好,但在我的台式机上却不行,它可以在 *** arch - i386 下安装软件包,但在 *** arch - x64 下会报告错误消息

C:/PROGRA~1/R/R-34~1.4/bin/x64/R.dll: file not recognized: File format not recognized

导致错误的命令是

C:/Rtools/mingw_32/bin/g++ -shared -s -static-libgcc -o PACKAGENAME.dll [...]

我认为错误的产生是因为 R 正在使用 mingw_32 来尝试编译 64 位包。问题是,我在哪里可以告诉 R 使用 mingw_64?我已经检查了所有我能记得的地方:

R 一定是在寻找其他地方来决定使用哪个编译器...但是在哪里?

如果您从 devtools::install_github 开始挖掘,它将引导您完成以下功能:

devtools::install_github
devtools:::install_remotes
devtools:::try_install_remote
devtools:::install_remote
devtools:::install
devtools:::check_build_tools
devtools:::setup_rtools
devtools:::scan_path_for_rtools

并且当您 运行 以下代码时:

devtools:::scan_path_for_rtools(TRUE)
devtools:::setup_rtools(debug=TRUE)

很可能是说当前未安装 Rtools。 (是的,有点违反直觉,因为您已经将它安装在 C:/Rtools 中,但可能未在注册表中注册)

要修复它,您需要 运行(本质上是 Rtools is not being detected from RStudio 中的解决方案)

Sys.setenv(PATH=paste0("C:\Rtools\bin;", Sys.getenv("PATH")))
devtools:::set_rtools_path(structure(list(path="c:/Rtools/mingw_64/bin", version=3.4), class="rtools"))
devtools:::set_rtools_path(structure(list(path="c:/Rtools/mingw_32/bin", version=3.4), class="rtools"))

如果这有效,请告诉我。

BINPREF ?= c:/Rtools/mingw_64/bin/

删除?之前 =

通过R CMD check not looking for gcc in Rtools directory:

R 在 C:/Users/MYUSERNAME/Documents/.R/Makevars 中查找 BINPREF 的值。删除此文件的内容删除了不正确的位置。

$RPATH/etc/i386/Makeconf 是 re-created 每个新安装的 R,并且包含行 BINPREF ?= c:/Rtools/mingw_32/bin/.
?= 运算符将设置 BINPREF 的值(如果尚未设置),就像在上面提到的 Makevars 文件中一样。因此,将 ?= 替换为 = 将一直有效,直到安装了新版本的 R 并覆盖了 Makeconf 文件——更新或卸载,R 不会修改 Makevars 文件在用户目录中。