【问题标题】:R Makevars file to overwrite R CMD's default g++ options?R Makevars 文件覆盖 R CMD 的默认 g++ 选项?
【发布时间】: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 了解元规则

标签: c++ r makefile g++


【解决方案1】:

你不能(根据 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

您当然可以输入 -mnative 或您的特定 CPU 标识符。

最后,如果你真的想要,你可以编辑/etc/R/Makeconf,但你必须这样做 每次升级 R 包后。正如我在这里所说的,你不需要这样做,因为这里建议的方案应该可以工作。

编辑:回应您的编辑:

a) 关于 r-devel 的明确建议(请查看档案)是,如果可以的话,您应该避免使用 Makefile 逻辑。 IIRC 这在编写 R 扩展手册中得到了回应。

b) 您声明了从.f(源)文件构建.o(对象)文件的规则。你试过用 cpp 而不是 f 做同样的事情吗?

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

【讨论】:

  • 感谢您的回答 (+1) - 但我不明白。正如我在上面所写的,我已经将 PKG_CXXFLAGS 设置为 PKG_CXXFLAGS= -O3 并将 PKG_CPPFLAGS 设置为 PKG_CPPFLAGS=-O3,但是在编译器反馈消息中 -O3 仍然出现在 -O2 的 left 上。你的意思是我应该改用“PKG_CXXFLAGS += -O3”吗?
  • 嗯,也许尝试在~/.R/Makevars 中设置而不是按包设置。并检查(基本 R)包 utils 中的代码,以确保准备调用编译器。
  • 谢谢,但我正在尝试在包级别找到一种方法。
  • 也许你不能?检查准备调用编译器的 R 代码,但请记住 Simon 的声明(在我的答案开头引用)。
  • -O2-O3 快,因为展开代码通常比紧凑代码慢。 -Os 有时会比任何一个都快,就像编译 Firefox 的 JS 引擎一样。
【解决方案2】:

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,但我不确定这有什么重要意义。

【讨论】:

  • 在我的 Makeconf 文件 (R 3.2.0) 中,它使用的是“CXX1XFLAGS”而不是“CXX11FLAGS”。
猜你喜欢
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多