我们的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 =备用编译器而其他人正在完美地工作。
答案 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