我有这个独立的C++代码
我试图包裹在R中
包。
我的问题是我绝对
希望使用-O3标志打开。
所以在src/Makevars文件中
我放:

PKG_CPPFLAGS = -I../inst/include
PKG_CXXFLAGS = -O3
CXX_STD = CXX11
而且当我在我的包上安装我的包时
机器,我看到:
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标志出现在右侧)
所以我的问题是:如何覆盖g++调用R CMD时使用的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
但是我不知道如何为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
我的问题解决了!

最佳答案

您不能(根据西蒙·厄本奈克(Simon Urbanek)对r-devel的评论)。

但这并不重要,因为AFAIK赢得了最正确的值(value)。 R将其值放在左侧,并允许您在右侧添加值(例如,通过CXX_FLAGS中的~/.R/MakevarsPKG_CXXFLAGS中的src/Makevars)。

因此,只需使用-O3覆盖它,它应该是-O3

对于它的值(value),我在~/.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)您声明了一个从.o(源)文件构建.f(对象)文件的规则。您是否尝试过使用cpp代替f做相同的事情?

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

关于c++ - R Makevars文件覆盖R CMD的默认g++选项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23414448/

10-11 16:51