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”。