我有这个独立的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代码做同样的事情......
所以,这样做是完全可能的。 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
我的问题解决了!
答案 0 :(得分:17)
你不能(根据Simon Urbanek关于r-devel的评论一段时间)。
但是,AFAIK最重要的价值胜出并不重要。并且R将其值放在左侧,并允许您添加您的值(例如,通过CXX_FLAGS
,例如~/.R/Makevars
或PKG_CXXFLAGS
从您的包中的src/Makevars
到正确的。
所以只需覆盖-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在Writing R Extension手册中得到了回应。
b)您声明了从.o
(源)文件构建.f
(对象)文件的规则。您是否尝试使用cpp而不是f?
最后,如果您的文件是使用-O2而不是-O3构建的,那么您还没有准确解释为什么世界即将结束。您应该理解,作为源的作者,您无法完全控制人们将构建您的包的哪些编译器选项(更不用说编译器版本)。
答案 1 :(得分:4)
newedit:好吧,我是个傻瓜。它解决了Rcpp
(我不在乎)的问题,但它对我关心的github.com/ohdsi/cyclops.git
包不起作用。那个仍然被-O2
卡在最右边。这是荒唐的。对命令行参数的控制可能是整个操作中最重要的一部分。 R需要一个更好的构建系统。
编辑:当然,经过几天的麻烦,我发布后就知道了。我的问题是我使用的是CXX_STD = CXX11
标志。显然,使用此标记您需要使用CXX11FLAGS += ...
。因此,如果您的Makevars
文件包含CXX11FLAGS += -O0 -Wall
,如果您正在使用C ++ 11,它将正确地将其放在-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
我已经从源代码安装Rcpp
(作为测试...我对它没有直接感兴趣)
install.packages(getwd(), repos = NULL, type = "source")
并且确实正确使用了-O0
。
使用我当前的配置,我最终得到三个不同的-O0'在左边,最后-O2
在右边。还有其他人遇到过这个问题吗?
我安装的软件位于github.com/ohdsi/cyclops.git
,但我不确定哪些重要。