【问题标题】:understanding RCpp compile理解 RCpp 编译
【发布时间】:2014-06-30 00:21:58
【问题描述】:

当我尝试 sourceCpp 一个 Rcpp 文件时,我正在查看 verbose=TRUE。最后的输出是:

DIR: C:/Users/xyz/AppData/Local/Temp/RtmpmielLn/sourcecpp_226416891d0e

C:/PROGRA~1/R/R-31~1.0/bin/x64/R CMD SHLIB -o "sourceCpp_22129.dll" --preclean "myfile.cpp" 
g++ -m64 -I"C:/PROGRA~1/R/R-31~1.0/include" -DNDEBUG     -I"C:/Users/xyz/Documents/R/win-library/3.1/Rcpp/include"  -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c myfile.cpp -o myfile.o
g++ -m64 -shared -s -static-libgcc -o sourceCpp_22129.dll tmp.def myfile.o -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LC:/PROGRA~1/R/R-31~1.0/bin/x64 -lR

对此我有几个问题:

  1. 第一个g++ 命令引用-I"d:/RCompile/CRANpkg/extralibs64/local/include",第二个命令引用-Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64-Ld:/RCompile/CRANpkg/extralibs64/local/lib。但我在任何地方都没有D: 驱动器或RCompile 文件夹。这些东西指的是什么?

  2. 我尝试手动运行第一个 g++,它运行文件并创建了 myfun.o 文件,但是当我尝试手动运行第二个 g++ 时,它给了我一个错误,说它找不到tmp.def 文件。我在驱动器上的任何地方都找不到tmp.def 文件。这个tmp.def 文件在哪里?

  3. 我查看了 sourceCpp 函数的底层。如果我直接在sourceCpp 函数中运行cmd 的定义:C:/PROGRA~1/R/R-31~1.0/bin/x64/R CMD SHLIB -o "sourceCpp_22129.dll" --preclean "myfile.cpp" on Windows' command window ,我注意到它不包括-I"C:/Users/xyz/Documents/R/win-library/3.1/Rcpp/include"R CMD SHLIB 给我一个错误。

sourceCpp 函数中的system(cmd, ..) 如何包含这个? sourceCppcmd变量的值不包括-I"C:/Users/xyz/Documents/R/win-library/3.1/Rcpp/include"

【问题讨论】:

  • 编译工作的整个设置以及如何手动完成,在Rcpp book 的第 2 章中也进行了讨论。您可能会发现阅读更完整的说明比尝试从屏幕上复制的随机命令更有收获。
  • @DirkEddelbuettel,谢谢。由于急于编写 Rcpp C++ 代码以提高 R 代码的速度,我完全跳过了您书的第 2 章。现在阅读。
  • @DirkEddelbuettel,还有一个问题:为什么 CLINK_CPPFLAGS 在 Windows 的用户/系统环境变量窗口中不可见,当它由 .setupBuildEnvironment 函数在 sourceCpp 中设置时。我在书中找不到答案
  • 注意对.restoreEnvironment 的调用——它会在sourceCpp 完成调用后恢复旧环境。我建议使用调试器(即debug(sourceCpp))单步执行sourceCpp,并研究环境如何变化/代码是如何自己执行的。

标签: r rcpp


【解决方案1】:

第 1 个 g++ 命令指的是 -I"d:/RCompile/CRANpkg/extralibs64/local/include",第 2 个命令指的是 -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 和 -Ld: /RCompile/CRANpkg/extralibs64/local/lib 。但是我在任何地方都没有 D: 驱动器或 RCompile 文件夹。这些东西指的是什么?

AFAIK 这些作为 CRAN R Windows 发行版的一部分保留;当 R 二进制文件在 Windows 上构建时,它们会在构建服务器上的这些库路径中使用某些东西(但无论如何都要保留在 R 中)。您可以放心地忽略它,但这有点奇怪。通过gcc / g++ 传递的未使用/不存在的目录将被忽略。

我尝试手动运行运行文件并创建 myfun.o 文件的第一个 g++,但是当我尝试手动运行第二个 g++ 时,它给了我一个错误,说它找不到 tmp.def 文件。我在驱动器上的任何地方都找不到 tmp.def 文件。这个 tmp.def 文件在哪里?

tmp.def,顾名思义,是由R CMD SHLIB 在Windows 上创建的临时定义文件。如果你只是重新运行你看到它不会生成的东西,所以我想 R 在窗帘后面做了一些事情来生成它。如果您对它的生成位置感到好奇,请参阅 R 源代码中的 share/make/winshlib.mk

我查看了 sourceCpp 函数的底层。如果我直接在sourceCpp函数中运行cmd的定义: C:/PROGRA~1/R/R-31~1.0/bin/x64/R CMD SHLIB -o "sourceCpp_22129.dll" --preclean "myfile.cpp"在 Windows 的命令窗口上,我注意到它不包含 -I"C:/Users/xyz/Documents/R/win-library/3.1/Rcpp/include" 并且 R CMD SHLIB 给了我一个错误。

这是因为sourceCpp 也在幕后为您设置了适当的环境标志——在本例中为CXXFLAGS 环境变量。当在 DESCRIPTION 文件中指定 LinkingTo: 条目时,这也会在软件包安装时自动完成。

【讨论】:

  • 谢谢。问题:sourceCpp 文件中的哪些部分/行处理/引用/使用CXXFLAGS?当我在 Windows 的命令窗口上运行相同的 cmd 变量时,为什么不包含 CXXFLAGS
  • 抱歉,我想这不太正确。是 Rcpp:::.buildClinkCppFlags 在做这项工作,例如看看Rcpp:::.buildClinkCppFlags("Rcpp") 给你什么。这是为CLINK_CPPFLAGS 变量设置的。尝试在 Rcpp 中浏览R/Attributes.R
  • 谢谢。我注意到sourceCpp 文件中的.setupBuildEnvironment 调用.buildClinkCppFlags,这反过来又设置了CLINK_CPPFLAGS 变量。你知道CLINK_CPPFLAGS 变量在哪里未设置吗?
【解决方案2】:

我有一个与问题中发布的非常相似的 g++ 编译命令,一个非常简单的 C 函数的编译对我不起作用。

它不起作用的原因是 g++ 命令中显示的以下选项: -I"d:/RCompile/CRANpkg/extralibs64/local/include"

在我的计算机上不存在的驱动器上添加一个包含目录。显然,g++ 会忽略 -I 选项中列出的不存在的目录(如 Kevin Ushey 所述),但对于不存在的驱动器,情况似乎并非如此。

我收到的错误信息是找不到sdtlib.h头文件:

C:/PROGRA~1/R/R-32~1.0/include/R.h:28:20:致命错误: d:/RCompile/r-compiling/local/local320/include/stdlib.h:输入/输出 错误#include

为了从 g++ 命令中删除有问题的 -I 选项,我必须编辑位于 $(R_HOME}/etc$(R_ARCH) 的 Makeconf 文件(在我的情况下为 C:\Program Files\R\R-3.2 .0\etc\x64) 并注释掉该行:

LOCAL_SOFT = d:/RCompile/r-compiling/local/local320

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多