1. 这事到底是干什么的:为什么Windows下的R语言离不开Rtools
先说结论,免得你看半天不知道在讲什么。Rtools就是R语言在Windows系统上的一整套编译工具链,包含GCC编译器、make工具、各种命令行程序,以及让R能调用这些程序所需的系统库和配置脚本。它的核心作用只有一个:在Windows上把C/C++/Fortran源码编译成R能加载的包。说得再直白一点,你如果在Windows上跑install.packages("某个包"),绝大多数时候下载的是官方预编译好的二进制包,双击安装就行,根本用不到编译器。但一旦遇到源码安装的包、GitHub上开发的未发布版包、或者你自己写了Rcpp代码需要本地编译,R就会在后台去寻找编译工具,这时候没有Rtools,它就直接罢工。
这个问题为什么值得专门写一篇?因为R的官方帮助文档里面对Rtools的说明极其简略,RStudio的提示也经常只有一句“Please install Rtools”,Windows系统本身对PATH环境变量的管理又很反人类,再加上R每次升级、Rtools的版本号就会跟着变,新老用户很容易栽在版本对不上、PATH没生效、命令行和RStudio检测结果不一致这些坑里。我自己帮人排查过很多次R环境问题,十次里面有八次最后都追到了Rtools没装对或者环境变量配置错。
这篇东西适合谁看?刚把R装好、一编译就报错的新手,被Running 'configure'卡住但在网上搜不到有效方案的半新手,还有那些装了Rtools但C++代码一编译就提示找不到g++的同事。文章里所有截图级别的细节我会用文字描述清楚,你跟着操作一遍基本就能把Windows上的R编译环境打通。
2. Rtools的整体设计与版本选型
2.1 Rtools到底包含什么,它和R是什么关系
先理解它的构成。Rtools不是某个单一软件的安装包,而是一个工具链的集合。里面大致包含MinGW-w64版的GCC编译器(负责把C/Fortran/Rcpp代码编译成机器码)、GNU make(负责根据Makefile自动组织编译流程)、链接器ld与相关库文件、还有一堆用于源码配置的shell工具(如sh、sed、awk)。在R扩展包的构建体系中,包作者会用configure脚本检测当前系统的编译能力,Rtools提供了这一整套支持。
你可以把Rtools想象成一个翻译团队:R本身说R语言,但如果你想给R写一个效率更高的底层模块(用C++实现),你写出来的是C++源码,团队里的GCC负责把它翻译成Windows能执行的原生指令,make负责指挥翻译流程按正确的先后顺序进行,最终R在运行时会通过动态链接库的方式把这些翻译成果加载进来。这个“翻译-指挥-链接”的流水线,就是我们说的编译环境。
R和Rtools各管各的,但版本必须匹配。R的升级策略是每年回归一次大版本(x.y.0),每个月打一次补丁版本(x.y.z),Rtools的大版本号基本跟着R的主版本走。比如R 4.3.x对应Rtools43,R 4.4.x对应Rtools44,R 4.5.x则对应Rtools45。如果你用R 4.4却装了个Rtools43,某些功能能工作,但一旦涉及较新的C++标准特性、或包本身对编译器版本有要求,就会莫名报错。Rtools的安装包本身可以从CRAN的镜像站下载,一般都是几十到一百多兆,安装过程比普通软件稍慢,因为它要解压非常多的文件。
2.2 Rtools和RTools的区别,以及版本对应表
新手特别容易在网上搜到两种写法:Rtools和RTools。其实早期(R 2.x和3.x时代)官方叫法就是Rtools,到4.0之后安装程序显示的名称为RTools,二者是同一个东西,只是品牌风格变了。你不需要钻这个牛角尖,搜索时两个关键词都试一下就行。
下面这个版本对应表是我在实际使用中反复核对过的,应该能帮你节省不少排查时间。
| R主版本 | 对应Rtools | 默认安装路径 | 是否需要手动配置PATH |
|---|---|---|---|
| R 4.0.x | Rtools40 | C:\rtools40 | 需要,安装时可勾选自动写入PATH |
| R 4.1.x | Rtools40(更新版) | C:\rtools40 | 需要,安装时可勾选自动写入PATH |
| R 4.2.x | Rtools42 | C:\rtools42 | 建议手动确认,部分版本自动写入会失败 |
| R 4.3.x | Rtools43 | C:\rtools43 | 安装时勾选PATH,一般能自动写入 |
| R 4.4.x | Rtools44 | C:\rtools44 | 安装时勾选PATH,一般能自动写入 |
| R 4.5.x | Rtools45 | C:\rtools45 | 安装时勾选PATH,一般能自动写入 |
注意:这里说的PATH,就是Windows环境变量中的Path。R在编译时会通过查找PATH来定位
gcc.exe、make.exe这些可执行程序。如果PATH里没有Rtools所在目录,R就会认为编译器不存在。
2.3 一个容易忽略的细节:Rtools的自动PATH与系统PATH
Windows的环境变量分为两种:系统环境变量和用户环境变量。系统环境变量的作用范围是所有用户,修改时需要管理员权限;用户环境变量只对当前用户生效,普通权限就能改。Rtools安装程序在“勾选自动添加PATH”时,一般写入的是用户环境变量,而不是系统环境变量。很多人装完Rtools之后,直接打开一个已经运行中的终端窗口去敲which gcc,发现找不到,就以为是安装失败,其实只是环境变量没刷新——终端的PATH是启动时就读取好的,你需要重新打开一个新的终端窗口才能看到最新的环境变量。
3. 实操安装全流程:从下载到第一次成功编译
3.1 第一步:确认自己的R版本,选对Rtools版本
安装任何东西之前都要先确认基线。打开R或者RStudio,在控制台输入R.version.string,你会看到类似R version 4.3.2 (2023-10-31 ucrt)这样的输出,主版本号就是4.3,那你需要的就是Rtools43。
这一步看起来很简单,但很多人会栽在“我明明装了Rtools43,为什么编译时找不到”这个问题上,后来发现原因是他同时装了R 4.2和R 4.3两个版本,RStudio当前默认用的是R 4.2,而R 4.2需要的是Rtools42。所以先跑一下R.version.string再做版本匹配,别凭记忆。如果你电脑上有多个R版本,建议在RStudio的Tools -> Global Options -> R version里固定一个默认版本,否则RStudio会自动选择最新的一个,可能和你预期的并不一样。
3.2 第二步:获取Rtools安装包的正确渠道
Rtools的安装包就在CRAN官网,入口通常位于网页左侧的“Other”栏目下,写着“Rtools”,点击后会自动跳到对应的下载页面。R 4.0及以后的版本,CRAN给出了非常明确的下载链接,文件名一般类似Rtools43.exe、Rtools44.exe。国内用户可以优先选择清华镜像或中科大镜像,速度会快很多。需要说明的是,Rtools虽然托管在CRAN站点上,但它本身并不属于R基础包,它只是配套工具。如果你下载时发现镜像站没有Rtools的入口,可以直接访问CRAN的官方主页,不依赖镜像就行。
下载时注意位数。现在绝大多数电脑是64位Windows,请下载64位版本;32位Windows在新版Rtools中已经不支持了,如果你还在用非常老旧的32位系统,建议先升级系统,否则不仅仅是Rtools的问题,很多R包也没法正常工作。
3.3 第三步:安装过程中的勾选项
Rtools安装程序是一个常规的Windows向导程序,前半段就是NEXT、I Agree那种老套路。真正需要注意的是安装选项这一步,程序会问你“Select Additional Tasks”,里面有一个勾选项,大意是“Add Rtools to system PATH”。这个勾选默认可能是勾上的,也可能没有,具体看版本。我个人的建议是:无论默认是否勾选,你都不要再额外修改,直接接受默认值,然后完成安装即可。安装完成后,先不要急着关掉终端,我们还需要做手工验证和可能的补充配置。
还有一个更关键的点:Rtools的安装路径。默认路径类似C:\rtools43,这个路径里没有空格,也没有中文,是非常理想的。千万不要自作主张改成C:\Program Files\Rtools43——里面的空格在编译时会成为路径解析的噩梦,make和configure脚本会把路径按空格切断,导致各种莫名其妙的“No such file or directory”。记住,一律使用默认路径,这是无数人踩过坑之后总结出来的经验。
3.4 第四步:验证安装和PATH是否生效
安装完成之后,打开一个新的PowerShell窗口(记得是新的窗口,别用安装之前就开着的),依次输入以下命令来验证:
# 查看R的版本,确认R本身能用 R --version # 检查Rtools的gcc是否已在PATH中 gcc --version # 检查make是否在PATH中 make --version如果你能看到类似于gcc.exe (GCC) 12.2.0这样的输出,说明PATH已经自动配置好了。如果你看到的是“无法将‘gcc’项识别为 cmdlet、函数、脚本文件或可运行程序的名称”,那就说明PATH没有生效,你需要走下面第4章的步骤手动配置环境变量。
另外,RStudio本身也提供了一个便捷的检查入口。在RStudio中,打开一个新脚本,执行:
# 检查Rtools是否被R正确识别 Sys.which("make") # 查看当前PATH中是否存在Rtools目录 Sys.getenv("PATH")如果你执行Sys.which("make")之后返回了类似C:\rtools43\usr\bin\make.exe的路径,那就说明R能正确找到编译工具。如果返回的是空字符串make,就说明R在PATH里找不到make,这时候你必须处理环境变量的问题。这个验证方法非常关键,因为RStudio内部的R进程和你在PowerShell里的PATH未必一致,个人经验是:RStudio启动后会自动读取系统环境变量,如果你在修改环境变量之前就打开了RStudio,它可能还保留着旧的环境变量,需要重启RStudio再试。
3.5 第五步:用一个小包做个编译测试
验证环境是否完全可用,最稳妥的方式是真实编译一个包。我推荐你试试Rcpp,因为它是R生态中最依赖编译器的包之一,而且安装量极大、兼容性很好。在R控制台里执行:
install.packages("Rcpp", type = "source")注意,type = "source"的意思是强制从源码编译,而不是下载预编译的二进制包。如果你想更直接地测试编译过程,还可以用Rcpp包里自带的一个小测试:
# 安装完成后,运行Rcpp自带的编译测试 library(Rcpp) evalCpp("2 + 2")如果返回4,说明从R调用编译器的整条链路都是通的,你的Rtools环境就算配置成功了。如果这一步报错,最常见的错误信息是g++ not found或make not found,这就明确指向PATH问题,下面一章我会展开讲。
4. Windows环境变量配置的完整细节
4.1 环境变量的基本概念:为什么R找不到编译器
先聊清楚概念,不然你只知道改,不知道为什么要改。Windows的PATH(或者写作Path)环境变量,本质上是一个目录列表。当你在命令行里输入一个命令名(比如gcc)时,Windows会依次在PATH包含的目录中去寻找对应的gcc.exe文件。它不会全局扫描整个硬盘,那样太慢了。R在编译时是通过system调用来执行gcc、make这些命令的,所以R进程的PATH同样决定了它能不能找到这些工具。
因此,“配置环境变量”的本质,就是把Rtools的可执行文件目录加入PATH。Rtools安装目录下通常有两个bin目录:一个是C:\rtools43\bin(里面主要是一些辅助工具),另一个是C:\rtools43\usr\bin(里面包含make、sh等Unix工具)。而真正的编译器gcc.exe在C:\rtools43\mingw64\bin下面。这三个目录需要都加进PATH吗?答案是:不一定全都要,但建议都加上。不同版本的Rtools对PATH的预期略有差异,R 4.2以后官方推荐的方式是把C:\rtools43\usr\bin加入PATH,R在编译时会通过启动脚本自动去定位mingw64\bin。但从实践经验出发,手动把三个目录都加进去,可以覆盖更多边缘情况,尤其是当你从命令行直接调用编译器时,不至于找不着。
4.2 手动配置PATH的完整步骤(Win10/Win11通用)
如果你确定自动配置没生效,或者你想把Rtools的路径从用户级提升到系统级方便其他账号使用,那就手动操作。下面以Windows 11为例,Win10其实完全一样。
第一步:右键点击桌面上的“此电脑”(或“我的电脑”),选择“属性”,然后点击窗口右侧的“高级系统设置”。
第二步:在弹出的“系统属性”窗口中,点击下方的“环境变量(N)...”按钮。
第三步:在“用户变量”区域,选中名为Path的变量(如果没有就新建一个,变量名就叫Path),点击“编辑”。
第四步:在编辑窗口中,点击“新建”,然后依次添加以下三个条目:
C:\rtools43\binC:\rtools43\usr\binC:\rtools43\mingw64\bin
注意,我这里写的是Rtools43的默认路径,如果你装的是Rtools44,那就是C:\rtools44\bin、C:\rtools44\usr\bin、C:\rtools44\mingw64\bin,以此类推。当你输入第一个条目时,Windows可能会自动在后面添加一个反斜杠,没关系,不影响。三条路径确认无误后,一路点“确定”关闭所有窗口。
第五步:关键中的关键——关闭所有已经打开的终端窗口和RStudio,然后重新打开。配置环境变量只是写入注册表,已经运行的程序不会自动感知这个变化,你必须让它们重新启动,才会加载新的PATH。这是个非常反直觉的点,很多新手配置完发现没用,其实就是忘了重启终端。
第六步:再次验证。新开一个PowerShell窗口,输入gcc --version,如果这次能正常输出版本信息,就说明PATH配置生效了。再去RStudio里跑一下Sys.which("make"),确认R这边也正常。
4.3 用户级PATH和系统级PATH怎么选
在“环境变量”窗口里,你会看到上下两个区域:上半部分是“User的用户变量”,下半部分是“System的系统变量”。我给的建议是:优先配置用户变量,别碰系统变量,除非你很清楚自己在做什么。
原因有两个。第一,修改用户变量不需要管理员权限,修改系统变量需要弹出UAC确认窗口,如果你在公司电脑上用的不是管理员账号,系统变量根本改不了。第二,用户变量只影响你自己,不乱动系统全局配置,降低把其他软件搞挂的风险。PATH里面如果少了某个关键目录,可能导致某些软件启动失败,这种事我见得太多了。Rtools是给R用的,你在自己的用户级PATH里配好,完全够用。
4.4 配好PATH之后如何批量验证工具
PATH配置完之后,不要只看一个gcc就完事。我建议你新建一个PowerShell窗口,一次性检查所有关键工具是否就位:
# 逐个检查编译工具链中的关键程序 gcc --version g++ --version make --version sh --version如果你的R版本比较旧(比如R 3.6对应的Rtools35),可能还需要检查ls、cp、sed这些工具,但R 4.x系列一般只需要关注前面这几个就够了。如果在某个命令上提示找不到,你可以用where.exe来定位它到底去哪了:
# 查看gcc的实际路径 where.exe gcc # 看输出中是否包含rtools的路径where命令会按PATH中的顺序依次查找,并列出所有匹配的可执行文件。如果你发现Rtools的路径排在很后面,而系统里恰好还有其他软件(比如Git自带了一个mingw64)提供了gcc.exe,就有可能出现“找到了gcc但是版本不对”的诡异问题。这个问题在下一章详聊。
5. 常见问题与排查思路:这些坑我都帮你踩过了
5.1 “g++ not found”但明明装了Rtools
这个场景我遇到太多次了。用户装了Rtools,在RStudio里编译Rcpp包时报sh: g++: command not found,但自己去“系统属性”里看PATH又觉得没问题。
排查思路就三步。
第一步,确认Rtools实际安装的架构。新版Rtools默认安装的是64位工具链,路径在C:\rtools43\mingw64\bin,如果你在PATH里写的是C:\rtools43\mingw32\bin(32位),那肯定找不到g++.exe,因为你的工具链在mingw64文件夹里。
第二步,确认PATH条目的顺序。Windows在搜索命令时会按PATH中的先后顺序来,如果之前装过MinGW或Git自带的GCC,它的路径排在了Rtools前面,系统会优先找到那个旧版本。旧版GCC可能不支持R 4.x要求的C++17标准,编译时会冒出类似error: 'std::filesystem' is not found的提示。解决办法是:在用户PATH中,把Rtools的三个目录位置整体提到最前面——在编辑窗口中选中Rtools的条目,点击“上移”即可。
第三步,确认你重启了RStudio。RStudio启动时读取一次环境变量,如果它是你改PATH之前打开的,那么它内部的R进程使用的还是旧PATH。这种情况下,最简单的办法是彻底退出RStudio(不是关窗口,而是托盘退出或任务管理器结束进程),然后重新打开再试。
5.2 R版本是4.3,但装的Rtools版本对不上
Rtools和R的版本绑定关系不是随便定的,而是由R核心团队在构建二进制包时的工具链版本决定。如果你用R 4.5配Rtools43,很多包在编译时可能会报一个很隐晦的错误,比如undefined reference to 'Rf_error',这是因为R工具链的ABI接口发生了变化。遇到这种问题,别去折腾编译器参数,直接下载对应版本的Rtools重装一遍,基本能解决。
需要补充装多个版本Rtools吗?如果你平时只用一个R版本,一个Rtools完全够用。如果你确实需要同时跑多个R版本(比如一个R 4.2用于旧项目,一个R 4.5用于新项目),那Rtools42和Rtools45都可以装在电脑里,它们井水不犯河水,因为R在编译时会根据自身的版本去PATH中寻找对应版本的目录。前提是PATH里相关的目录都要存在,顺序无关紧要。
5.3 “installation of package had non-zero exit status”背后的信息
这个错误几乎是源码安装包时报错的“万金油”,它真正有用的信息在它上面几行,你得往上翻控制台输出,找到configure: error: ...或者Error: ...那一段。R的源码包在安装时通常会先运行configure脚本来探测系统环境,这个脚本依赖sh和make,也依赖环境变量R_HOME、R_INCLUDE这些。很多时候,配置失败是由于缺少某个系统库,比如libxml2、curl,这时候单纯升级Rtools是没用的,需要你先安装对应的系统依赖。
一个实用的建议:当报错出现时,把控制台输出完整复制下来,搜里面checking for ...后面跟着no的条目。比如你看到checking for gcc... no,那毫无疑问是编译器没进PATH;如果是checking for libcurl... no,那你就得先去安装对应的依赖包。这类问题是R包生态中的常态,不是你环境配置的锅。
5.4 Win11下环境变量改了,但新的终端里还是找不到
Windows 11偶尔有一个特殊毛病:环境变量明明改了,也开了新终端,但echo $env:Path输出却是不完整的。这多半是因为Windows的终端程序并不是每次都从注册表重新读取环境变量,而是继承了某个父进程(比如Windows资源管理器)的环境变量。改完PATH之后,如果你不想重启电脑,可以尝试用任务管理器重启一下Windows资源管理器,或者干脆注销再登录。注销一次就能强制刷新所有进程的环境变量,比重启电脑快得多。
5.5 快速排错:把所有检查项浓缩成一张表
我把常见问题的现象和对应处理方式整理成一个速查表,方便你遇到问题直接对照。
| 问题现象 | 可能原因 | 处理方式 |
|---|---|---|
gcc --version提示无法识别 | Rtools未装或PATH未配置 | 检查安装目录,手动添加三个PATH条目 |
RStudio报g++ not found但终端能找到 | RStudio启动早于PATH修改 | 退出并重启RStudio,必要时注销系统 |
编译时出现make not found | usr\bin未加入PATH | 添加C:\rtoolsxx\usr\bin到PATH |
where.exe gcc找到的不是Rtools路径 | 其他软件自带GCC,PATH顺序被抢占 | 把Rtools路径在PATH中上移到前位 |
编译报错undefined reference | R与Rtools版本不匹配 | 按R主版本重装对应Rtools |
| 官网下载Rtools速度极慢 | 网络问题 | 使用CRAN镜像站 |
| 安装过程中杀毒软件报警 | 编译器行为被误判 | 将安装目录加入杀软白名单,或临时暂停实时防护 |
顺带提一嘴:国内网络环境下从CRAN下载Rtools有时非常不稳定。我之前帮朋友远程装环境时,就遇到过下载到99%断掉的情况。建议用IDM之类的下载工具,或者直接找国内镜像站下载安装包,省心很多。
6. 进阶技巧:把Rtools配置省心化的几个思路
6.1 用.Rprofile自动设置Rtools路径
如果你手头有多个R版本,或者你的Rtools装在非默认路径,R在编译时可以通过环境变量RTOOLS43_HOME之类去定位Rtools的根目录。但不同版本识别方式略有不同,比较通用的做法是在R的.Rprofile里写一段灵活的路径探测逻辑。.Rprofile是R在启动时会自动读取的配置文件,位于用户主目录(Windows下通常是C:\Users\你的用户名\Documents\.Rprofile,或R.home()目录下)。可以直接在里面加上这样一段:
# 自动识别当前R版本对应的Rtools路径 rtools_version <- sub("\\..*$", "", as.character(getRversion())) rtools_root <- paste0("C:/rtools", rtools_version) if (dir.exists(rtools_root)) { Sys.setenv(PATH = paste0( file.path(rtools_root, "bin"), ";", file.path(rtools_root, "usr/bin"), ";", file.path(rtools_root, "mingw64/bin"), ";", Sys.getenv("PATH") )) }这段脚本做的事情很简单:获取当前R的主版本号(比如4.4),拼接出默认的Rtools路径,然后把三个bin目录插入到PATH最前面。这样做的好处是,你以后升了R版本、换了系统,也不用重新手动配置PATH,R每次启动都会自己去找。如果你不想把Rtools写入系统PATH(比如公司电脑权限受限),这个方案极为好用。
6.2 在R构建过程中临时指定编译器路径
有些时候,你会遇到一个特殊情况:Rtools装了,环境变量也配了,但某个包的编译脚本比较“固执”,它指定了自己的编译器路径。此时你可以在编译前设置两个环境变量,强制R使用Rtools的编译器:
# 强制指定C和C++编译器 Sys.setenv(CC = "C:/rtools43/mingw64/bin/gcc.exe") Sys.setenv(CXX = "C:/rtools43/mingw64/bin/g++.exe")这种方法适合临时调试。除非必要,日常使用不推荐,因为它会绕过R自己管理工具链的逻辑,适用范围比较有限。但在排查问题时,它可以帮助你快速确认问题到底是出在PATH还是出在包自身。
6.3 devtools和pkgbuild:现代R包开发的环境自检利器
如果你打算写R包,或者经常编译GitHub上的开发版包,建议装上devtools和pkgbuild这两个包。它们自带对编译环境的检查功能,比自己手工验证方便得多:
# 安装开发工具包 install.packages(c("devtools", "pkgbuild")) # 检查Rtools是否配置正确 pkgbuild::check_build_tools()check_build_tools()会检查Rtools是否存在、版本是否匹配、PATH是否正确,并给出明确的错误提示。如果一切正常,它返回TRUE;如果有问题,它会告诉你缺什么、该在哪里改。devtools也是经常被误判为“装不上”的包之一,因为它安装时就需要编译大量依赖,如果你连devtools都装不上,多半说明Rtools的问题还没真正解决。
6.4 把RStudio的“Terminal”和PowerShell打通
RStudio内置了一个终端面板,默认使用Windows的命令提示符或者PowerShell。这个终端的PATH环境变量来自RStudio进程的启动环境,所以如果你在RStudio外面新建的终端里gcc可用,但RStudio内置终端里不可用,那还是同一个问题:RStudio需要重启。某些情况下,RStudio的内部终端和R控制台的PATH也不一致——终端用的是shell的PATH,R控制台用的是R进程的PATH。如果你确认shell里面gcc能用,但R控制台里Sys.which("make")查不到,最彻底的解决方法是注销Windows用户再重新登录,这样所有进程都会重新继承新的环境变量,不会有残留。
7. 关于Rtools版本升级和卸载时的注意事项
7.1 升级R之后是否需要重装Rtools
是的,需要。R升级到新主版本后(比如从4.3升到4.4),建议同时安装对应新版本的Rtools,并且可以保留旧版本不卸载,直到你确认新环境一切正常。但要注意一点:R 4.2之后,R默认使用UCRT工具链(Universal C Runtime),它和旧版的MSVCRT工具链在二进制层面不兼容。如果你用R 4.1和Rtools40编译过本地包,升级到R 4.4之后这些包需要重新编译。这也是很多人升级R之后发现一堆包“失踪”的原因——不是包没了,而是旧包基于旧工具链编译,新R无法加载。
碰到这种情况,不要浪费时间想着怎么“修复”旧包,直接在R 4.4里重新install.packages()把需要的包装一遍,一般十几分钟就搞定。
7.2 卸载Rtools的干净姿势
如果你确实想把某个旧版Rtools卸载干净,先卸载程序本身,然后检查三个地方的残留:
- 环境变量Path里是否还有旧路径,手动删掉;
C:\rtools43这样的安装目录是否还存在残余文件,如果程序卸载没删干净,手动删除;- 检查
C:\Users\你的用户名\.Rprofile以及R_HOME\etc\Renviron中是否有指向旧版本的路径。
第四处是很多人漏掉的:R本身在启动时可能会读取R_TOOLS或RTOOLS相关的环境变量。你需要在系统属性里搜索“RTOOLS”(不分大小写),如果发现任何残留,一并删除。
8. 最后再说点实在话
Rtools这个东西,本身不复杂,复杂的是Windows对环境和路径的“历史包袱”。我自己从R 2.15时代一路装到现在,经历过Rtools31、34、35、40、42、43、44,中间踩过的坑太多了。印象最深的一次,帮一个同事排查了整整一下午,最后的结论竟然是他在PATH里手动输入路径时,把C:\rtools43打成了C:\rtools43\然后后面又多加了一个反斜杠,结果路径变成了C:\rtools43\\bin,Windows虽然能容忍多一个反斜杠,但某些工具脚本却接受不了。类似这种小问题,没有任何文档会告诉你,只能靠实操去积累。
所以如果你现在配置Rtools后依然遇到问题,我的建议只有一句话:别急着怀疑“是不是这个包有问题”,先老老实实把PATH打开,用where.exe逐一确认每个工具的位置,确认一遍之后再回头编译,大概率问题就消失了。工具链环境这东西,本质上就是“路径对了,一切就对了”。
最后再分享一个小技巧:当你在R控制台看到‘g++’ was not found这类报错时,可以先在RStudio里跑一次Sys.setenv(PATH = paste("C:/rtools43/usr/bin", Sys.getenv("PATH"), sep = ";"))临时救急,然后回头再去修复系统配置。这个操作没法替代正确的PATH配置,但能让你的编译任务先跑起来,不至于卡在环境问题上干着急。等这个临时环境满足了当下需求,再趁有空的时候把PATH彻底配好,后面就不用再折腾了。