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
/CXX14
和 PKG_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要么构建系统,要么一起玩。如果你遵守规则,这会奏效。
创建带有已编译 C++ 扩展的 R 包时,可以在文件中指定用于编译它的 C++ 标准和标志 src/Makevars
- 例如:
CXX_STD = CXX11
PKG_CXXFLAGS = -fmyflag
尽管 R 构建系统在编译中使用了变量,例如 CXX
(C++ 编译器)和 PKG_CXXFLAGS
(传递给 C++ 编译器的标志),它也有特定于标准的标志例如 CXX11
/CXX14
和 PKG_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要么构建系统,要么一起玩。如果你遵守规则,这会奏效。