理解RCpp编译

时间:2014-06-30 00:21:58

标签: r rcpp

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

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. 第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文件夹。这些东西指的是什么?

  2. 我尝试手动运行运行文件并创建g++文件的第一个myfun.o,但是当我尝试手动运行第二个g++时,它给了我一个错误说它无法找到tmp.def文件。我无法在驱动器的任何位置找到tmp.def文件。这个tmp.def文件位于何处?

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

  4. R CMD SHLIB功能中的system(cmd, ..)如何包含此内容? sourceCppcmd变量的值不包括sourceCpp

2 个答案:

答案 0 :(得分:3)

  

第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++传递的未使用/不存在的目录将被忽略。

  

我尝试手动运行第一个g ++运行文件并创建了myfun.o文件,但是当我尝试手动运行第二个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环境变量。当在LinkingTo:文件中指定DESCRIPTION条目时,这也会在包安装时自动完成。

答案 1 :(得分:1)

我在问题中发布了一个非常类似的g ++编译命令,一个非常简单的C函数的编译对我来说并不起作用。

它没有工作的原因是g ++命令中显示的以下选项: -I" d:/ RCompile / CRANpkg / extralibs64 /本地/包括"

在我的计算机上不存在的驱动器上添加了一个include目录。显然,-g选项中列出的不存在的目录被g ++忽略(如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