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代码做同样的事情......
所以,这样做是完全可能的.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/Makevars
或PKG_CXXFLAGS
从src/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构建的,那么您还没有准确解释为什么世界即将结束.您应该理解,作为源的作者,您无法完全控制人们将构建您的包的哪些编译器选项(更不用说编译器版本).
新编辑:好吧,我是个傻瓜。它解决了问题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
,但我不确定这是什么重要的。
归档时间: |
|
查看次数: |
8704 次 |
最近记录: |