当我尝试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 g++
个命令引用-I"d:/RCompile/CRANpkg/extralibs64/local/include"
,第2个命令引用-Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64
和-Ld:/RCompile/CRANpkg/extralibs64/local/lib
。但我在任何地方都没有D:
驱动器或RCompile
文件夹。这些东西指的是什么?
我尝试手动运行运行文件并创建g++
文件的第一个myfun.o
,但是当我尝试手动运行第二个g++
时,它给了我一个错误说它无法找到tmp.def
文件。我无法在驱动器的任何位置找到tmp.def
文件。这个tmp.def
文件位于何处?
我看了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}给了我一个错误。
R CMD SHLIB
功能中的system(cmd, ..)
如何包含此内容? sourceCpp
中cmd
变量的值不包括sourceCpp
答案 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