Windows11利用Msys(Mingw64)编译R 非Rtools

1848人浏览 / 0人评论 / 添加收藏

注意注意,按照这个方式编译后的R,很多Rcpp开头的包都要源码方式重新编译安装,否则会出错!!
首先,我之所以会做这个事情是因为我某次更新win11之后,发现我的所有R包全都用不了了。于是乎我更新了R之后,发现依然用不了,查了一下有人提到R更新了Rtools。
于是我感觉R简直对Win用户太不友好了,因为低版本编译的R包在高版本R上现在是完全用不了,每次更新R还要相应的更新Rtools+所有自己编译的R包,成本也太高了。我就在想本身Rtools就是Msys改的,为什么不能统一用一个Msys编译一个高版本的R出来。
由于我的Msys里的Mingw64装了很多东西,所以我不确定到底依赖什么包,但是我确定是gcc,icu,libz,png,tiff这几个包是必须的。
然后简单做一个记录,也方便自己以后如果要重新编译高版本的R可能遇到的问题。
命令其实很简单,首先下载源码后进入src目录有一个gnuwin32,进去后执行make就可以了,所以win上面千万不要在外面执行configure,那个是过不去的。
然后第一个编译问题是会发现一个compat.c文件编译错误,这个文件在src/extra/trio里面,这个错误是因为重定义了C自带的printf函数,R编译的时候用的是gnu99标准,这个标准是不允许重载的,而且网上关于这个的说法非常少!!!我找了好久发现把trio里面的Makefile.win里面 改成用gnu89就可以编译

compat.o: compat.c
gcc -std=c89 $(CPPFLAGS) -O3 -Wall -pedantic $(DEFINES) -c $< -o $@
endif

第二个问题是在编译R.dll的时候会依赖三个icu的库,我不知道R官方都是从哪里找到这三个库的,实际上名字全是错的,可以手动执行编译出错的那条命令,用下面的库名

-licuin -licuuc $(EXT_LIBS)/lib/libicudt.a -lstdc++

第三个问题是编译Rgui的时候,会有一个关于argc的错误,这个我网上也没找到,但是自己试出来了,在src/gnuwin32/front-ends中有一个graphappmain.c,把里面_W64下面的argc以及argv前面两个下划线改成一个,我不确定为什么会出这个问题,但是反正在RStudio之中也不用Rgui,能编译过就行。

之后就可以顺利过去了。我就在想R官方真的可以不用改这些编译过去吗?他们为什么要对MinGW64的icu库进行重命名?故意恶心人吗?

全部评论