R Makevars文件以覆盖R CMD';s默认的g++;选择? 我有这个独立的C++代码 我想用一个R来包装 包裹

R Makevars文件以覆盖R CMD';s默认的g++;选择? 我有这个独立的C++代码 我想用一个R来包装 包裹,c++,r,makefile,g++,C++,R,Makefile,G++,我的问题是我绝对 希望使用 -O3打开标志 因此在src/Makevars文件中 我说: 当我在电脑上安装软件包时 机器,我明白了: g++ -std=c++0x -I/usr/share/R/include -DNDEBUG -I../inst/include -O3 -fpic -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_F

我的问题是我绝对 希望使用
-O3
打开标志

因此在
src/Makevars
文件中 我说:

当我在电脑上安装软件包时 机器,我明白了:

g++ -std=c++0x -I/usr/share/R/include -DNDEBUG -I../inst/include -O3  -fpic  -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -g -c mycppfunctions.cpp -o mycppfunctions.o
g++ -std=c++0x -shared -Wl,-Bsymbolic-functions -Wl,-z,relro -o mycppfunctions.so mycppfunctions.o -L/usr/lib/R/lib -lR
(可怕的
-O2
标志出现在右侧

所以我的问题是:如何覆盖 当
R CMD
调用
g++
时使用的cpp标志

编辑: 最近,在另一个软件包中,我找到了一种方法 类似于F77代码(也在R包中)。 基本上,通过将其添加到
Makevars

PKG_FFLAGS = $(FPICFLAGS) $(SHLIB_FFLAGS) 
all: $(SHLIB)
otherf77foo.o: otherf77foo.f
    $(F77) $(PGK_FFLAGS) -O3 -pipe -g -c -o otherf77foo.o otherf77foo.f
CFLAGS +=       -O0 -Wall
CXXFLAGS +=     -O0 -Wall
CPPFLAGS +=     -O0 -Wall

PKG_CFLAGS +=       -O0 -Wall
PKG_CXXFLAGS +=     -O0 -Wall
PKG_CPPFLAGS +=     -O0 -Wall
但我不知道如何对cpp代码执行相同的操作

编辑2: 所以,这样做是完全可能的。德克·埃德尔布埃特尔(Dirk Eddelbuettel)在下面的回答中提出了“b”问题 引导我找到解决方案。所以,我所要做的就是 将其放入
src/Makevars
文件:

mycppfoo.o: mycppfoo.cpp
    g++ -std=c++0x -I/usr/share/R/include -DNDEBUG -I../inst/include -fpic  -g -O3 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -g -c mycppfoo.cpp -o mycppfoo.o
    g++ -std=c++0x -shared -Wl,-Bsymbolic-functions -Wl,-z,relro -o mycppfoo.so mycppfoo.o -L/usr/lib/R/lib -lR
我的问题解决了

你不能(根据西蒙·乌尔巴内克不久前在r-devel上的评论)

但这并不重要,因为只有最有价值的人才会赢。R将其值放在左边,并允许您将您的值(例如通过包中的
src/Makevars
中的
~/.R/Makevars
PKG\u cxflags
添加到右边

所以只要用
-O3
覆盖,它应该是
-O3

值得一提的是,我在
~/.R/Makevars
中的当前值是:

CFLAGS +=              -O3 -Wall -pipe -pedantic -std=gnu99
CXXFLAGS +=            -O3 -Wall -pipe -Wno-unused -pedantic
当然,您可以加入
-mnative
或特定的CPU标识符

最后,如果您真的需要,您可以编辑
/etc/R/Makeconf
,但您必须这样做 在R包的每次升级之后。正如我在这里所说的,你不需要像这里所建议的计划那样去做

编辑:响应您的编辑:

a) 关于r-devel(请检查归档文件)的明确建议是,如果可以的话,应该避免Makefile逻辑。IIRC这在编写R扩展手册中得到了回应

b) 您声明了从
.f
(源)文件生成
.o
(对象)文件的规则。你试过用cpp而不是f做同样的事情吗


最后,您还没有确切地解释,如果您的文件是使用-O2而不是-O3构建的,那么世界将走向末日的原因。你应该明白,作为源代码的作者,你无法完全控制人们将使用哪些编译器选项(更不用说编译器版本)来构建你的包。

newedit:好吧,我是个傻瓜。它解决了
Rcpp
(我不关心)的问题,但它不适用于我关心的
github.com/ohdsi/cyclops.git
包。那辆车仍然卡在最右边。这太荒谬了。对命令行参数的控制可能是整个操作中最重要的一部分。R需要一个更好的构建系统

编辑:当然,在经历了几天的麻烦之后,我在发帖后马上找到了答案。我的问题是我使用了
CXX\u STD=cx11
标志。显然,有了这个标志,您需要使用
CXX11FLAGS+=…
。因此,如果您的
Makevars
文件包含
CXX11FLAGS+=-O0-Wall
,那么如果您使用的是C++11,它将正确地将其置于
-O2
标志的右侧

无论我做什么,我都不能让-O0出现在右边。我的
~/.R/Makevars
中有以下内容:

PKG_FFLAGS = $(FPICFLAGS) $(SHLIB_FFLAGS) 
all: $(SHLIB)
otherf77foo.o: otherf77foo.f
    $(F77) $(PGK_FFLAGS) -O3 -pipe -g -c -o otherf77foo.o otherf77foo.f
CFLAGS +=       -O0 -Wall
CXXFLAGS +=     -O0 -Wall
CPPFLAGS +=     -O0 -Wall

PKG_CFLAGS +=       -O0 -Wall
PKG_CXXFLAGS +=     -O0 -Wall
PKG_CPPFLAGS +=     -O0 -Wall
我已经从源代码安装了
Rcpp
(作为测试…我对它不感兴趣),使用

这确实正确地使用了
-O0

在我当前的配置中,我得到了三个不同的-O0在左边,最后的
-O2在右边。还有其他人遇到过这个问题吗


我正在安装的软件位于github.com/ohdsi/cyclops.git
,虽然我不确定这有什么重要。

谢谢你的回答(+1)--但我不明白。如上所述,我已经将PKG_CXXFLAGS设置为PKG_cxflags=-O3,并将PKG_CPPFLAGS设置为PKG_CPPFLAGS=-O3,但在编译器反馈消息中,-O3仍显示在-O2的左侧。你的意思是我应该用“PKG_cxflags+=-O3”来代替吗?嗯,也许可以尝试在
~/.R/Makevars
中设置每个包。并检查(base R)包utils中的代码,该包为编译器调用做准备。谢谢,但我正在试图找到一种在包级别执行此操作的方法。也许你不能?检查准备调用编译器的R代码,但请记住Simon的语句(在我的答案开头引用)。
-O2
-O3
快,因为展开的代码通常比紧凑的代码慢
-Os
有时比两者都快,就像编译Firefox的JS引擎一样。不过我建议不要上传这样的软件包。我们让R来填充这些值是有原因的。@Dirkedelbuettel:我不认为Brian Ripley会让CRAN这么做:)顺便说一句,我使用R包机制来简化代码在统计团队中的内部循环,所以这不是真正的问题。:-)和+1来理解Makeconf文件(R 3.2.0)中使用的元规则“CXX1XFLAGS”而不是“CXX11FLAGS”。