R 的 Makevars:PKG_CXXFLAGS 与 PKG_CXX11FLAGS

R's Makevars: PKG_CXXFLAGS vs. PKG_CXX11FLAGS

创建带有已编译 C++ 扩展的 R 包时,可以在文件中指定用于编译它的 C++ 标准和标志 src/Makevars - 例如:

CXX_STD = CXX11
PKG_CXXFLAGS = -fmyflag

尽管 R 构建系统在编译中使用了变量,例如 CXX(C++ 编译器)和 PKG_CXXFLAGS(传递给 C++ 编译器的标志),它也有特定于标准的标志例如 CXX11/CXX14PKG_CXX11FLAGS/PKG_CXX14FLAGS.

R Extensions Manual 没有过多提及其他标志,但它确实提到当前默认标准是 C++11,因此 CXX == CXX11,并且不同编译器可能用于不同的 C++ 标准。一些注释还提到 PKG_CXXFLAGS 在某些情况下可能仅适用于默认的 CXX 编译器。

如果我正在创建一个包,其中我定义了一个 src/Makevars 并且我特别要求它编译为 C++11:

CXX_STD = CXX11

我应该通过 PKG_CXXFLAGS 指定标志,还是应该使用 PKG_CXX11FLAGS,或者两者兼而有之? portable/good-practice 是否使用特定于标准的标志?

现在我认为它应该不会有任何区别,但默认标准将来可能会改变,我希望包继续工作而无需更改。我看到诸如 RcppArmadillo 之类的软件包只有 PKG_CXXFLAGS+CXX_STD,但是如果我尝试向我的用户 Makevars 添加标志,通常软件包只会在它们处于 PKG_CXX11FLAGS.

这是错误的:

CXX_STD = CXX11
PKG_CXXFLAGS = -fmyflag

因为你这两条线有矛盾,所以你需要

CXX_STD = CXX11
PKG_CXX11FLAGS = -fmyflag

就我个人而言,我一直不太明白为什么我们有四个这样的包,因为任何一个包都只能编译成一个标准,但是……耸肩表情符号……我不拥有 R要么构建系统,要么一起玩。如果你遵守规则,这会奏效。