【发布时间】:2014-05-01 18:51:35
【问题描述】:
我有这个独立的 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
我的问题解决了!
【问题讨论】:
-
我建议不要上传这样的包。我们让 R 填充这些值是有原因的。
-
@DirkEddelbuettel:我认为 Brian Ripley 不会让它在 CRAN 上传递 :) 顺便说一下,我使用 R 包机制来轻松 internal 在stat team 所以这不是一个真正的问题。
-
:-) 和 +1 了解元规则