R ::使用Makevars覆盖C编译器

时间:2016-09-21 20:29:20

标签: r

我们的R安装定义于:

R$HOME/etc/Makeconf that CC = gcc -std=gnu99 

我有一个需要使用

编译的特定包(C ++和C代码的混合)
  CC = gcc  

没有-std=gnu99

据我了解,我有3种方法可以做到这一点:
1)系统范围,编辑R $ HOME / etc / Makeconf
2)以每个用户为基础,玩〜/ .R / Makevars
3)每个包的基础上,设置PACKAGE / src / Makevars

即使1和2不是我想要的,我使用1和2

测试了3个选项

R CMD INSTALL -l pack.tgz可以" gcc -std = gnu99"被" gcc"

取代

但是当使用PACKAGE/src/Makevars方法时,它会失败

我必须承认我此时已经迷失了,我应该在哪里看?

修改。 这与Building R Packages using Alternate GCC并不重复 我确实读过上一篇文章。这是指向Makevars的那篇

我关键的一点是 PACKAGE / src / Makevars 不考虑CC =备用编译器而其他人正在完美地工作。

1 个答案:

答案 0 :(得分:2)

我在fortran遇到过类似的问题。无论如何,我制作了你的包装模型,我发现了一半的解决方案。似乎并未考虑和使用PACKAGE/src/Makevars中的所有变量。为了使其工作,我使用了这个Makevars文件:

MY_PKG_LIBS =
MY_PKG_CCLAGS = -I/usr/share/R/include -DNDEBUG -fpic  -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g

all: $(SHLIB)                      
hello.o: hello.c
        gcc $(MY_PKG_CCLAGS) -c hello.c -o hello.o $(MY_PKG_LIBS)

PKG_LIB = -std=gnu++11

显然,hello.c文件应由your_file_name.c替换。如果您无法更改CC并采用我的解决方法,那么真正的问题就是在创建共享文件.so时,应使用PKG_CFLAGS或{{1}覆盖编译器标志如Writing R Extensions中所述(再次在PKG_CPPFLAGS文件中)。在我的个人情况(Ubuntu 15.04,R 3.1.2)中,我按照Makevars文件中的指南尝试了这些和其他变种:

/etc/R/Makeconf

在向ALL_CFLAGS = $(R_XTRA_CFLAGS) $(PKG_CFLAGS) $(CPICFLAGS) $(SHLIB_CFLAGS) $(CFLAGS) ALL_CPPFLAGS = $(R_XTRA_CPPFLAGS) $(PKG_CPPFLAGS) $(CPPFLAGS) $(CLINK_CPPFLAGS) 最终编译包中添加标志的唯一方法是在{{1}中添加库链接器标志(正如我最初使用我的fortran代码)-shared }}。 我安装软件包的最终结果是:

PKG_LIB = -std=gnu++11