Ubuntu22.04升级R4.4后安装vroom等包编译错误求助
R4.4升级后包编译错误的解决办法
问题详情
把Ubuntu22.04上的R升级到4.4版本后,重装R包时多个包都出现编译失败的问题。比如装vroom包时,运行install.packages("vroom")会得到以下错误:
cc1plus: some warnings being treated as errors make: *** [/usr/lib/R/etc/Makeconf:202 : delimited_index.o] Error 1 ERROR: compilation failed for package ‘vroom’ * removing ‘/home/username/R/x86_64-pc-linux-gnu-library/4.4/vroom’
对应的警告信息示例如下:
/usr/lib/R/site-library/cpp11/include/cpp11/protect.hpp:337:42: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 5 has type ‘SEXP’ {aka ‘SEXPREC*’} [-Wformat=] 337 | REprintf("%x CAR: %x CDR: %x TAG: %x\n", head, CAR(head), CDR(head), TAG(head)); | ~^ ~~~~~~~~~ | | | | unsigned int SEXP {aka SEXPREC*}
所有警告的格式都一样,只是protect.hpp后面的行号不同,参数2到5都存在这种类型的警告。之前试过重装Rcpp包,没用。
解决步骤(无需回退到R4.3)
临时关闭警告转错误:在安装包前,先在R里设置编译选项,让编译器不把警告当成错误处理:
Sys.setenv(CXXFLAGS = "-Wno-error=format") install.packages("vroom")这个设置只在当前R会话生效,安装完包后会自动恢复默认规则。
更新cpp11包:问题根源是旧版本cpp11和R4.4不兼容,先更新cpp11再装目标包:
# 如果更新cpp11时也报错,先执行上面的Sys.setenv命令 install.packages("cpp11") install.packages("vroom")检查系统编译器版本:Ubuntu22.04默认的gcc-11完全适配R4.4,如果你手动换过编译器版本,切回默认版本试试:
sudo update-alternatives --config gcc sudo update-alternatives --config g++清理旧包缓存后重装:删除残留的旧包文件,再重新安装:
remove.packages(c("cpp11", "vroom")) # 清理下载缓存 unlink(file.path(Sys.getenv("HOME"), ".cache", "R", "pkgdownload"), recursive = TRUE) install.packages("cpp11") install.packages("vroom")
原因说明
R4.4默认开启了-Werror=format编译选项,会把格式匹配类的警告直接转为错误。而旧版本的cpp11包代码里存在格式字符串和参数类型不匹配的问题,触发了这些警告,最终导致编译失败。更新cpp11到最新版本就能从根源解决这个问题,临时关闭警告转错误是应急的快速解决办法。
内容的提问来源于stack exchange,提问作者Alaiis
相关产品推荐
相关产品推荐

