繁体   English   中英

rcpp第一次编译麻烦

[英]Rcpp First Compilation trouble

我最近从亚马逊下载了2013 Rcpp书籍,以学习如何更好地将C ++与我的R代码一起使用,并且我正在尝试第一个带有第一个fibonacci递归函数和包装器的编译示例,以查看是否可以这样做。 我正在使用最新R的Ubuntu。

首先我的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 ++代码中需要include指令,所以我再做一次,但是这次是在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 cd到目录,则文件在那里。

谢谢,本

您似乎忽略了一个重要的细节。 当你做

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

前两个的结果应分配并导出到外壳。 您在这里所做的“分配和忘记”。

您从清单2.1中错过了这一点(显示了这本书(或者可能是电子书删除了它-我没有电子书))是非常重要的结尾反斜杠,它使所有内容都变成一行:

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

现在,赋值与对R(壳脚本本身)的调用在同一执行中发生,它具有值,并将其传递给g ++。

您可以通过接下来的两行告诉我,其中我完全引用了包含所有必需的-I和-L部分的结果命令。 因此,两者(编译和链接步骤)都要经过多行。

因此,这本书是正确的,并且按照所示方式进行所有操作。 内联(在本章后面讨论)和属性(也在本章的后面讨论)基本上都为您分配了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节和属性。 两者都更好。 用那些。

您是如何安装R的? 看来您缺少R标头。 也许您需要安装r-base-dev软件包

关于代码,您不需要包装器。 您可以将其放在.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM