gpt4 book ai didi

c++ - R Makevars 文件覆盖 R CMD 的默认 g++ 选项?

转载 作者:IT老高 更新时间:2023-10-28 22:19:53 26 4
gpt4 key购买 nike

我有这个独立的 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标志出现在右边)

所以我的问题是:我怎样才能覆盖R CMD 调用 g++ 时使用的 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 最右边的值获胜。 R 将它的值放在左边,并让你添加你的值(例如,通过 ~/.R/MakevarsPKG_CXXFLAGS code> 从你的包中的 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) 您声明了从 .f(源)文件构建 .o(对象)文件的规则。你试过用 cpp 而不是 f 做同样的事情吗?

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com