【发布时间】: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
对此我有几个问题:
第一个
g++命令引用-I"d:/RCompile/CRANpkg/extralibs64/local/include",第二个命令引用-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函数的底层。如果我直接在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, ..) 如何包含这个? sourceCpp中cmd变量的值不包括-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,并研究环境如何变化/代码是如何自己执行的。