R Makevars文件覆盖R CMD的默认g ++选项?

use*_*035 16 c++ makefile r g++

我有这个独立的C++代码,我试图将其包装在R包中.

我的问题是我绝对希望它与-O3标志一起编译 .

所以在src/Makevars我放的文件中:

PKG_CPPFLAGS = -I../inst/include
PKG_CXXFLAGS = -O3  
CXX_STD = CXX11
Run Code Online (Sandbox Code Playgroud)

当我在我的机器上安装包装时,我看到:

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
Run Code Online (Sandbox Code Playgroud)

(可怕的-O2旗帜出现在右边)

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

编辑:

最近,在另一个包中,我找到了一种方法来为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
Run Code Online (Sandbox Code Playgroud)

但我不知道如何为cpp代码做同样的事情......

EDIT2:

所以,这样做是完全可能的.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
Run Code Online (Sandbox Code Playgroud)

我的问题解决了!

Dir*_*tel 17

你不能(根据Simon Urbanek对r-devel的评论一段时间).

但是AFAIK最重要的价值胜利应该不重要.并且R将其值放在左侧,并允许您将值添加到右侧(例如CXX_FLAGS,从包中,~/.R/MakevarsPKG_CXXFLAGSsrc/Makevars包中).

所以只需覆盖,-O3它应该是-O3.

值得一提的是,我目前的价值观~/.R/Makevars是:

CFLAGS +=              -O3 -Wall -pipe -pedantic -std=gnu99
CXXFLAGS +=            -O3 -Wall -pipe -Wno-unused -pedantic
Run Code Online (Sandbox Code Playgroud)

你当然可以投入-mnative或你的特定CPU标识符.

最后,如果您真的想要编辑,/etc/R/Makeconf但每次升级R包后都必须这样做.而且我在这里争论你不需要,因为这里建议的方案应该有效.

编辑:响应您的编辑:

a)关于r-devel的明确建议(请检查档案)是你应该避免使用Makefile逻辑.IIRC在Writing R Extension手册中得到了回应.

b)您声明了一个规则来.o.f(源)文件构建(对象)文件.您是否尝试过使用cpp而不是f?

最后,如果您的文件是使用-O2而不是-O3构建的,那么您还没有准确解释为什么世界即将结束.您应该理解,作为源的作者,您无法完全控制人们将构建您的包的哪些编译器选项(更不用说编译器版本).

  • 谢谢你的答案(+1) - 但我不明白.如上所述,我已经将PKG_CXXFLAGS设置为PKG_CXXFLAGS = -O3和PKG_CPPFLAGS设置为PKG_CPPFLAGS = -O3,但仍然在编译器反馈消息中-O3出现在-O2的*left*.你的意思是我应该使用"PKG_CXXFLAGS + = -O3"吗? (2认同)

Tho*_*erg 5

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

编辑:当然,经过几天的麻烦,我在发布后就弄清楚了。我的问题是我正在使用该CXX_STD = CXX11标志。显然,有了这个标志,您需要使用CXX11FLAGS += .... 因此,如果您的Makevars文件包含它,并且您使用的是 C++11,CXX11FLAGS += -O0 -Wall则会正确地将其放在标志的右侧。-O2

无论我做什么,我都无法让 -O0 显示在右侧。我的 中有以下内容~/.R/Makevars

CFLAGS +=       -O0 -Wall
CXXFLAGS +=     -O0 -Wall
CPPFLAGS +=     -O0 -Wall

PKG_CFLAGS +=       -O0 -Wall
PKG_CXXFLAGS +=     -O0 -Wall
PKG_CPPFLAGS +=     -O0 -Wall
Run Code Online (Sandbox Code Playgroud)

我已经使用Rcpp从源代码安装(作为测试......我对它不直接感兴趣)

install.packages(getwd(), repos = NULL, type = "source")
Run Code Online (Sandbox Code Playgroud)

并且确实正确使用了-O0.

根据我当前的配置,我最终会在左侧得到三个不同的 -O0,-O2在右侧得到最后一个。还有其他人遇到过这个问题吗?

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