我们的R安装定义如下:
R$HOME/etc/Makeconf that CC = gcc -std=gnu99
我有一个需要使用编译的特定包(C和C代码的混合)
CC = gcc
没有-std = gnu99
据我所知,我有三种方法:
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 =备用编译器而其他人正在完美地工作.
最佳答案 我在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或PKG_CPPFLAGS覆盖编译器标志,如Writing R Extensions中所述(再次在Makevars文件中).在我的个人情况(Ubuntu 15.04,R 3.1.2)中,我按照/ etc / R / Makeconf文件中的指南尝试了这些和其他变量:
ALL_CFLAGS = $(R_XTRA_CFLAGS) $(PKG_CFLAGS) $(CPICFLAGS) $(SHLIB_CFLAGS) $(CFLAGS)
ALL_CPPFLAGS = $(R_XTRA_CPPFLAGS) $(PKG_CPPFLAGS) $(CPPFLAGS) $(CLINK_CPPFLAGS)
在为包的最终编译添加标志时唯一有用的是在PACKAGE / src / Makevars中添加库链接器标志(正如我最初使用我的fortran代码)PKG_LIB = -std = gnu 11.
我安装软件包的最终结果是:
Installing package into ‘/home/home/R/x86_64-pc-linux-gnu-library/3.1’
(as ‘lib’ is unspecified)
* installing *source* package ‘question1’ ...
** libs
gcc -I/usr/share/R/include -DNDEBUG -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g -c hello.c -o hello.o
gcc -std=gnu99 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o question1.so hello.o -std=gnu++11 -L/usr/lib/R/lib -lR
installing to /home/dgarolini/R/x86_64-pc-linux-gnu-library/3.1/question1/libs
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (question1)