【发布时间】:2013-10-02 15:12:07
【问题描述】:
我最近从 amazon 下载了 2013 Rcpp 书,以了解如何更好地将 C++ 与我的 R 代码一起使用,我正在尝试使用第一个斐波那契递归函数和包装器的第一个编译示例,看看我是否能做到。我在 Ubuntu 上使用最新的 R。
首先是我的 C++:
/* Cpp based recurive function */
int fibonacci(const int x){
if(x == 0) return(0);
if(x == 1) return(1);
return(fibonacci(x - 1) + fibonacci(x - 2));
}
/* Wrapper */
extern "C" SEXP fibWrapper(SEXP xs) {
int x = Rcpp::as<int>(xs);
int fib = fibonacci(x);
return(Rcpp::wrap(fib));
}
然后我启动 sh 并输入:
PKG_CXXFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'`
PKG_LIBS=`Rscript -e 'Rcpp:::LdFlags()'`
R CMD SHLIB Fibonacci.cpp
但我明白了:
g++ -I/usr/share/R/include -DNDEBUG -fpic -O3 -pipe -g -c Fibonacci.cpp -o Fibonacci.o
Fibbonacci.cpp:10:12: error: 'SEXP' does not name a type
make: *** [Fibonacci.o] Error 1
我想也许我需要在我的 C++ 代码中包含指令,所以我再做一次,但这次在 C++ 文件的顶部使用 #include<Rcpp.h>,并在 sh 中再次执行相同的命令,但仍然没有乐趣:
g++ -I/usr/share/R/include -DNDEBUG -fpic -O3 -pipe -g -c Fibonacci.cpp -o Fibonacci.o
Fibonacci.cpp:1:18: fatal error: Rcpp.h: No such file or directory
compilation terminated.
make: *** [Fibbonacci.o] Error 1
我做错了什么? 如果我查询我在 sh 中设置的值:
$PKG_CXXFLAGS
sh: 9: -I/local/yrq12edu/R/x86_64-pc-linux-gnu-library/3.0/Rcpp/include: not found
$PKG_LIBS
sh: 10: -L/local/yrq12edu/R/x86_64-pc-linux-gnu-library/3.0/Rcpp/lib: not found
但我认为找不到消息只是因为 -L 标志,因为如果我 cd 到目录,文件就在那里。
谢谢, 本。
【问题讨论】:
-
这个我不熟悉,大概是这样的:
Rcpp:::SHLIB("fibbonacci.cpp")在包含cpp文件的目录中? -
刚刚用 Rcpp:::SHLIB 尝试过,正如你和这篇博文的建议:computerbastard.com/rcpp-c-compilation-trick 我得到以下信息:
$ Rscript -e "Rcpp:::SHLIB('fibbonacci.cpp')" make: *** No rule to make targetfibbonacci.o',fibbonacci.so'. Stop需要/跨度> -
对于它的价值,我完全不同意 Rcpp::SHLIB 的建议。也可以在这里删除。
-
抱歉,我忘记了
Rcpp:::SHLIB建议用于 Windows。评论被删除。
标签: c++ r compiler-construction fibonacci rcpp