如何覆盖R使用的编译器?解决~/.R/Makevars配置不生效问题
从源码编译R包时覆盖默认编译配置的解决方案
如何覆盖R安装目录下etc/Makeconf的默认设置
R编译配置的读取优先级从高到低为:
- 待编译R包自带的
src/Makevars配置 - 用户级自定义配置
~/.R/Makevars(macOS/Linux系统) - 系统级默认配置
R安装目录/etc/Makeconf
因此只需在用户级Makevars中写入需要覆盖的编译参数,即可优先于默认Makeconf生效。
~/.R/Makevars配置不生效的常见原因与修复方案
针对macOS系统搭配官方R二进制版本、使用MacPorts gfortran的场景,可按以下步骤排查修复:
- 确认文件路径与命名正确
首先检查~/.R隐藏文件夹是否存在,不存在可运行mkdir -p ~/.R创建,配置文件必须命名为Makevars(无后缀、大小写严格匹配),可在终端运行ls ~/.R/Makevars确认文件存在。 - 补全Fortran相关配置变量
新版R调用Fortran编译器时会同时读取F77、FC等多个变量,仅配置FC会导致参数不生效,将你的Makevars内容调整为以下内容即可:F77 = /opt/local/bin/gfortran-mp-11 FC = /opt/local/bin/gfortran-mp-11 FLIBS = -L/opt/local/lib/gcc11 -lgfortran -lquadmath -lm - 排除其他配置覆盖
若配置了R_MAKEVARS_USER环境变量,或待编译的R包自带src/Makevars文件,会覆盖主目录下的全局配置,可在终端运行R CMD config --all | grep MAKEVARS确认环境变量指向的配置文件路径是否正确。 - 验证配置是否生效
修改配置后重启R,在终端运行R CMD config FC,若输出为/opt/local/bin/gfortran-mp-11则说明配置已生效。
相关官方文档说明
可通过以下两个官方内置文档查看Makevars与Makeconf的相关规则:
- 在R控制台运行
?Makevars查看内置帮助页面 - 在R控制台运行
vignette("R-exts"),查看第6章「Customizing package compilation」部分
近年R版本的相关调整
从R 4.2.0版本开始,官方macOS二进制版本对编译配置做了两处影响较大的调整:
- 拆分了x86_64与ARM64架构的默认编译参数,对Fortran编译器的变量调用新增了
FC1等字段 - 调整了默认gfortran的读取路径规则,旧版本仅配置
FC即可生效的写法不再兼容,需要同时配置F77与FC两个变量
如果你的R是从4.2.0之前的版本升级而来,就会出现原有配置失效的情况。
内容的提问来源于stack exchange,提问作者Szabolcs
相关产品推荐
相关产品推荐

