gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:29:20 35 4
gpt4 key购买 nike

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

〜/ .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

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

我有以下问题:
  • CXXCXX98CXX11CXX14之间是什么关系?
  • ,例如,如果已经隐含C++ 11,则CXX11STD = -std=c++11是什么意思?是在选择-std=c++11-std=gnu++11之间吗?出于可移植性原因,通常应避免使用-std=gnu++11吗?
  • 是否可以将CXXSTDCXXFLAGS的标志不仅仅添加到CXX中,这样前三行会减少为CXX = g++ -std=c++11 -fsanitize=undefined,address -fno-omit-frame-pointer。显式指定CXXSTDCXXFLAGS有什么好处?
  • CXX_STD = CXX11如何工作?这里的CXX11CXX11中的~/.R/Makevars有什么关系?
  • CXXFLAGSPKG_CXXFLAGS(我的示例中未包括)之间是什么关系?

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

    我添加了 Rcpp标签,因为我想这些问题的答案与 Rcpp的用户最相关,但是我知道这可能与 Rcpp没有直接关系,因此,如果认为合适,则可以将其删除。

    最佳答案

    Writing R Extensions: 1.2.1 Using Makevars中指定的Makevars文件是R特有的 Make 的变体。您列出的许多变量都称为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++ SupportR 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

    此外,如 Writing R Extensions: Section 1.2.4 Using C++11 Code所示,打包时应选择 CXX_STD而不是 CXXSTD。这仅仅是为了确保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

    Writing R Extensions: Section 5.5 Creating shared objects中有关于 PKG_*选项的简短说明。

    附录

    以下是@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,它提供了专门针对Windows环境的 Makevars文件。

    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/59269899/

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