gpt4 book ai didi

r - 了解 R 中 Makevars 文件的内容(宏、变量、~/.R/Makevars 和 pkg/src/Makevars)

转载 作者:行者123 更新时间:2023-12-01 19:25:03 25 4
gpt4 key购买 nike

我试图了解 ~/.R/Makevars 中设置的宏/变量的作用和关系和 package_directory/src/Makevars安装/构建自己的 R 包时。假设这些文件看起来像

~/.R/Makevars

CXX = g++
CXXSTD = -std=c++11
CXXFLAGS = -fsanitize=undefined,address -fno-omit-frame-pointer

CXX98 = g++
CXX98STD = -std=c++98

CXX11 = g++
CXX11STD = -std=c++11

CXX14 = g++
CXX14STD = -std=c++14

package_directory/src/Makevars
PKG_CPPFLAGS = -I../inst/include
CXX_STD = CXX11

据我了解,与 CXX我们可以在构建 R 包时选择 C++ 的编译器,使用 CXXSTD我们选择了标准和 CXXFLAGS我们添加编译器标志。与 PKG_CPPFLAGS我们为 C++ 预处理器和 CXX_STD 添加标志我们告诉我们我们的包使用 C++11。

我有以下问题:
  • CXX有什么关系和 CXX98 , CXX11CXX14 ?
  • 例如,CXX11STD = -std=c++11 的含义是什么?如果 C++11 已经隐含了?是在选择-std=c++11之间和 -std=gnu++11 ?应-std=gnu++11通常出于便携性原因而避免使用?
  • 可以为 CXXSTD 的标志和 CXXFLAGS不只是被添加到 CXX ,使得前三行减少到 CXX = g++ -std=c++11 -fsanitize=undefined,address -fno-omit-frame-pointer .显式指定 CXXSTD 有什么好处?和 CXXFLAGS ?
  • 怎么样CXX_STD = CXX11工作?怎么样CXX11这里与CXX11相关在 ~/.R/Makevars ?
  • CXXFLAGS有什么关系和 PKG_CXXFLAGS (不包括在我的例子中)?

  • 我知道 Writing R Extensions 中包含的信息和 R Installation and Administration ,但我无法提取超出我目前理解水平的更多信息来回答上述问题。

    我正在添加 Rcpp标记,因为我认为这些问题的答案与 Rcpp 的用户最相关。 ,但我知道这可能与 Rcpp 没有直接关系。 ,因此如果认为合适,标签可能会被删除。

    最佳答案

    Makevars文件,如 Writing R Extensions: 1.2.1 Using Makevars 中所指定, 是 Make 的变体这是 R 独有的。您列出的许多变量都称为 implicit variables .其含义如下:

    Implicit rules tell make how to use customary techniques so that you do not have to specify them in detail when you want to use them.



    这些 implicit variables
    规定应该使用什么编译器以及可用的选项。

    在 R 中,我们关心以下默认编译器选项:

    CC Program for compiling C programs; default ‘cc’.

    CXX Program for compiling C++ programs; default ‘g++’.

    CPP Program for running the C preprocessor, with results to standard output; default ‘$(CC) -E’.

    FC Program for compiling or preprocessing Fortran and Ratfor programs; default ‘f77’.



    下一组值详细说明了编译器应该使用哪些选项。通常,所有这些选项的默认值都是空字符串。

    CFLAGS Extra flags to give to the C compiler.

    CXXFLAGS Extra flags to give to the C++ compiler.

    CPPFLAGS Extra flags to give to the C preprocessor and programs that use it (the C and Fortran compilers).

    FFLAGS Extra flags to give to the Fortran compiler.

    LDFLAGS Extra flags to give to compilers when they are supposed to invoke the linker, ‘ld’, such as -L. Libraries (-lfoo) should be added to the LDLIBS variable instead.

    LDLIBS Library flags or names given to compilers when they are supposed to invoke the linker, ‘ld’. LOADLIBES is a deprecated (but still supported) alternative to LDLIBS. Non-library linker flags, such as -L, should go in the LDFLAGS variable.



    现在,R 根据不同的 C++ ISO 标准定义了“额外”的变体。这些变体在 R Administration: Section 2.7.2 C++ Support 中给出。和 R Administration: Section B.7 Compile and load flags

    CXX98 CXX98STD CXX98FLAGS CXX98PICFLAGS

    CXX11 CXX11STD CXX11FLAGS CXX11PICFLAGS

    CXX14 CXX14STD CXX14FLAGS CXX14PICFLAGS

    CXX17 CXX17STD CXX17FLAGS CXX17PICFLAGS



    说了这么多,让我们来解决第一个问题:

    What is the relationship between CXX and CXX98, CXX11 and CXX14?


    CXX是要使用的通用编译器选项。同时,R 定义了额外的 CXX根据检测到的编译标准使用的选项。也就是说,如果 -std=c++98 ( CXX98 语言规范)由 CXX_STD 设置,然后是与 CXX98 关联的编译器用来。同样,对于 CXX11CXX14 ,同样的逻辑。见 Rcpp Gallery: Using Rcpp with C++11, C++14 and C++17更多细节。

    What is the meaning of, e.g., CXX11STD = -std=c++11 if C++11 is already implied? Is it between choosing -std=c++11 and -std=gnu++11? Should -std=gnu++11 generally be avoided for portability reasons?


    CXX11STD的含义是为 C++11 编译确定合适的语言标准。这个选项的存在仅仅是因为如果 R 版本选择适当的 C++11 编译选项对编译器不正确,您可以更改它。存在这种情况的原因是因为每个编译器可能定义的 C++11 支持与下一个略有不同,如 R Installation and Administration: 2.7.2 C++ Support 所示。 :

    It may be [Footnote 13] that there is no suitable flag for C++11 support, in which case a different compiler could be selected for CXX11 and its corresponding flags.



    脚注 13:

    This is true for earlier versions of g++ such as 4.2.1, and also for commonly-used versions of the Solaris compiler CC.



    gcc 认可的语言标准详见 GCC Manual: 3.4 Options Controlling C Dialect .此外,有关在包中使用 C++11 和 R 的详细信息,请参阅 Writing R Extensions: Section 1.2.4 Using C++11 Code .

    通常,我会避免显式设置此变量。如果您必须明确设置此变量,我建议您使用 -std=c++11因为大多数编译器都支持这个声明。

    Could the flags for CXXSTD and CXXFLAGS not just be added to CXX, such that the first three lines reduce to CXX = g++ -std=c++11 -fsanitize=undefined,address -fno-omit-frame-pointer. What is the advantage in explicitly specifying CXXSTD and CXXFLAGS?



    是否可以?是的。对吗?不。

    当我们可以只拥有一个变量时,为什么还要有三个变量,每个变量都有自己的目标?

    三变量工作流的优势为不同的生产线提供了不同的角色。这允许快速理解编译选项的能力。因此,与在一行上塞进一个变量(终端宽度为 80)相比,它更容易理解。

    例如
    CXX = g++ -std=c++11 -fsanitize=undefined,address -fno-omit-frame-pointer

    对比
    CXX = g++ 
    CXX11STD = -std=c++11
    CXXFLAGS = -fsanitize=undefined,address -fno-omit-frame-pointer

    此外,您应该选择 CXX_STDCXXSTD包装时如图 Writing R Extensions: Section 1.2.4 Using C++11 Code .这只是为了确保 R 将包注册为需要 C++xy。另一种方法是写在 DESCRIPTION归档属性 SystemRequirements: C++xy ,其中 xy表示年份。

    How does CXX_STD = CXX11 work? How is CXX11 here related to CXX11 in ~/.R/Makevars?



    这将使用由 CXX11 设置的 C++11 编译器设置语言的编译和链接。 .通过指定 CXX11 ,您正在指定 variable in Make 这将用于编译配方下的文件:
    $(OBJCXX) $(ALL_CPPFLAGS) $(ALL_OBJCXXFLAGS) -c $< -o $@

    哪里 $(OBJCXX)CXX , $(ALL_CPPFLAGS)$(R_XTRA_CPPFLAGS) $(PKG_CPPFLAGS) $(CLINK_CPPFLAGS) $(CPPFLAGS) 给出, 和 $(ALL_OBJCXXFLAGS)$(PKG_OBJCXXFLAGS) $(CXXPICFLAGS) $(SHLIB_CXXFLAGS) $(OBJCXXFLAGS)
    .

    以上如下 /R/Makeconf.in .但是,例程可能是 /m4/R .

    What is the relationship between CXXFLAGS and PKG_CXXFLAGS (not included in my example)?



    这两个都指定了编译器的编译标志。它们在 Makevars 中的写入顺序是不同的。特别是,我们有
    CXXFLAGS placed after PKG_CXXFLAGS . 始终使用最正确的选项。 所以, CXXFLAGS优先于 PKG_CXXFLAGS .
    PKG_*上有一个简短的说明 Writing R Extensions: Section 5.5 Creating shared objects 中的选项.

    附录

    以下是@Dominik 在此回复的评论部分提出的问题。

    Is it correct that variables defined in ~/.R/Makevars apply globally to the installation of all packages, while variables in /src/Makevars only apply to the present package?



    是的。这是准确的。 ~/.R/Makevars 内的变量将适用于所有软件包,而 /src/Makevars每个包附带的只会影响该包的设置。 /src/Makevars 中的值将优先于 ~/.R/Makevars .

    某些包裹可能附带 /src/Makevars.win ,它提供了一个 Makevars专门针对 Windows 环境的文件。

    Is the compilation standard used for a packages nowadays only set via CXX_STD and not any more by PKG_CXXFLAGS as shown in gallery.rcpp.org/articles/simple-lambda-func-c++11?



    应该使用这两个标志的时间略有不同。特别是 CXX_STD仅在包环境中运行。与此同时,与其名称相反, PKG_CXXFLAGS , 影响所有编译选项。因此,当您引用上述 Rcpp 画廊帖子时,您正在观察正在运行的独立脚本。要快速进入正确的模式,这需要 PKG_CXXFLAGS要设置而不是 CXX_STD定义。

    现在,请原谅我简要介绍了独立使用编译选项的历史...... PKG_CXXFLAGS 的使用是有点老派。事实上,R 3.4 中的首选方法是设置环境变量 USE_CXX11 = "yes" .在 R 3.1 和 R 3.3 之间,标准是设置环境变量 USE_CXX1X = "yes" .在这些实例之前,使用 PKG_CXXFLAGS ="-std=c++11"首选。 (除了在 Windows 上,它需要 PKG_CXXFLAGS ="-std=c++0x" 。)

    Does using CXX_STD=CXX11 then mean to use all the settings given by CXX, CXXSTD, CXXFLAGS and CXX11PICFLAGS?



    否。这意味着使用由以下设置的选项:

    CXX11 CXX11STD CXX11FLAGS CXX11PICFLAGS

    关于r - 了解 R 中 Makevars 文件的内容(宏、变量、~/.R/Makevars 和 pkg/src/Makevars),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43597632/

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