在创建具有已编译的C++扩展的R包时,可以在文件src/Makevars
中指定用于编译它的C++标准和标志-例如:
CXX_STD = CXX11
PKG_CXXFLAGS = -fmyflag
尽管R build系统具有用于编译的变量,如CXX
( C++编译器)和PKG_CXXFLAGS
(传递给C++编译器的标志),但它也具有特定于标准的标志,如CXX11
/CXX14
和PKG_CXX11FLAGS
/PKG_CXX14FLAGS
。
R扩展手册没有对这些其他标志说太多,但它确实提到了当前的默认标准是C++11,因此CXX
== CXX11
,并且不同的编译器可能用于不同的C++标准。一些注释还提到,在某些情况下,PKG_CXXFLAGS
可能只适用于默认的CXX
编译器。
如果我正在创建一个包,其中定义了一个src/Makevars
,并且我特别要求它编译为C++11:
CXX_STD = CXX11
我应该通过PKG_CXXFLAGS
指定标志,还是应该使用PKG_CXX11FLAGS
,或者两者兼而有之?使用特定于标准的标志是可移植的/良好的做法吗?
现在,我假设它不会有任何不同,但默认标准可能会在未来发生变化,我希望包在没有变化的情况下继续工作。我看到像RcppArmadillo
这样的包只有PKG_CXXFLAGS
+CXX_STD
,但是如果我尝试向我的用户Makevars
添加标志,通常只有当它们在PKG_CXX11FLAGS
下时,包才会选择它们。
发布于 2021-08-27 22:29:59
这是错误的:
CXX_STD = CXX11
PKG_CXXFLAGS = -fmyflag
由于这两条线之间存在矛盾,因此您需要
CXX_STD = CXX11
PKG_CXX11FLAGS = -fmyflag
就我个人而言,我一直不太理解为什么我们会有四个这样的包,因为任何一个包都只能编译成一个标准,但是...耸肩-表情-在这里...我也不拥有R build系统,只是随大流而已。如果你遵守规则的话这是可行的。
https://stackoverflow.com/questions/68959897
复制相似问题