2013-10-02 150 views
2

我最近下载了2013 RCPP书断亚马逊学习如何更好地使用C++和我的R代码里面,我想用第一斐波那契的递归函数和包装的第一个编译例子,看看我能做到它。我在Ubuntu了最新的R.RCPP一次编译麻烦

首先我的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>,并再次做同样的命令,但仍然没有快乐:

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标志,因为这些文件存在,如果我到该目录。

感谢, 奔。

+0

我对此并不熟悉,大概是这样的:'Rcpp ::: SHLIB(“fibbonacci.cpp”)'在包含cpp文件的目录中? – Ward9250

+0

刚刚尝试过使用Rcpp ::: SHLIB,因为您和本博客的建议是这样的:http://www.computerbastard.com/rcpp-c-compilation-trick/我收到以下内容:'$ Rscript -e“ Rcpp ::: SHLIB('fibbonacci.cpp')“ make:***目标'fibbonacci.o'没有规则,需要'fibbonacci.so'。停止' – Ward9250

+1

对于它的价值,我完全不同意Rcpp :: SHLIB的建议。它可能在这里被删除。 –

回答

4

你似乎已经忽略了一个重要的细节。当你这样做时

PKG_CXXFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'` 
PKG_LIBS=`Rscript -e 'Rcpp:::LdFlags()'` 
R CMD SHLIB Fibonacci.cpp 

前两个的结果应该被分配并导出到shell。你在这里做什么“分配和忘记”。

从上市2.1遗漏了什么,显示这个(或者电子书放弃了它 - 我没有电子书)是非常重要斜杠,这使得一切一行:

PKG_CXXFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'` \ 
PKG_LIBS=`Rscript -e 'Rcpp:::LdFlags()'` \ 
R CMD SHLIB Fibonacci.cpp 

现在分配发生在与调用R(一个shell脚本本身)相同的执行中,它具有这些值并将它们传递给g ++。

您可以通过接下来的两行中,我完全引用它拥有所有必需-I和-L片所产生的命令告诉。因此,这两者(编译和链接步骤)都要经过多行。

所以这本书是正确的,而这一切工作,如果做了showns方式。内联(在本章后面讨论)和属性(后面在同一章节中讨论)基本上都是为你做PKG_CXXFLAGSPKG_LIBS分配。

编辑:另外,你的测试是错误的。你的意思可能是这个

$ PKG_CXXFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'` 
$ echo $PKG_CXXFLAGS 
-I/usr/local/lib/R/site-library/Rcpp/include 
$ 

你不能只是“调用” shell变量,因此“没有发现”你得到的答案。

编辑2:无论如何,您尝试的例子实际上只是为了激发第2.4节中的其余讨论,其中详细描述了多么费力,容易出错......这是 - 导致第2.5节和2.6内联和属性。两者都好得多;使用这些。

+0

感谢解释@DirkEddelbuettel和指向Rcpp属性的指针Romain。我用反斜杠重新做了这个过程并且它可以工作(你是对的,我忘了提到echo命令)。 – Ward9250

+0

很高兴听到它的作品。属性在1.2.5和2.6节中有介绍,应该让你开始。有关全部细节,请参阅Rcpp附带的小插图;本书的例子都很好,尽管大多数都是使用内联。 –

1

您是如何安装R?它看起来像你缺少R头。也许你需要安装r-base-dev package

关于代码,你不需要包装。你可以把这个在.cpp文件:

#include <Rcpp.h> 
using namespace Rcpp ; 

// [[Rcpp::export]] 
int fibonacci(const int x){ 
    if(x == 0) return(0); 
    if(x == 1) return(1); 
    return(fibonacci(x - 1) + fibonacci(x - 2)); 
} 

,只是sourceCpp此文件:

> sourceCpp("fib.cpp") 
> fibonacci(6) 
[1] 8 
+0

好的,我会试试这个,我按照我的方式尝试,因为我在Rcpp电子书5640的Loc 1318上 - 列表2.2。 – Ward9250

+0

当然。不幸的是,属性('[[Rcpp :: export]]装饰)是在Dirk写作这本书期间(和接近尾声)出现的,所以它们在本书中没有多少内容。不过,我们鼓励人们使用这些日子。例如,Rcpp图库中的所有示例都使用属性。 –

+0

@RomainFrancois:你的第一行有错误。编译器告诉他Rcpp.h缺失,而不是R.h.他有正确的R包;他没有正确地传达'-I'标志。 –