RCPP 第一次编译问题
Rcpp First Compilation trouble
>我最近从亚马逊下载了 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++代码中使用 include 指令,所以我再次这样做,但这次#include<Rcpp.h>
在C++文件的顶部,并再次在 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 到目录,文件就在那里。
谢谢本。
你似乎忽略了一个重要的细节。当你这样做时
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(shell 脚本本身(相同的执行中,它具有值并在对 g++ 的调用中传递它们。
你可以通过接下来的两行来判断,其中我完全引用了具有所有必需的 -I 和 -L 片段的结果命令。因此,(编译和链接步骤(都经过多行。
所以这本书是正确的,如果按照所示的方式完成,所有这些都是有效的。 内联(在本章后面讨论(和属性(也在同一章后面讨论(基本上为您PKG_CXXFLAGS
和PKG_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
- 编译包含字符串的代码时遇到问题
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 编译要在英特尔Hyperscan中使用的.cc文件时出现问题
- 如何在 Mac 上正确编译C++,当它在 Linux 上编译没有问题时?
- Rextester 语言编译C++问题
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- C++ 多级虚拟继承编译问题
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 使用 CImg 库的 std::min 和 std::max 的编译问题
- Qt Visual Studio 2015 加载项编译问题
- 构造函数和 G++ 编译配方的问题
- 解析问题 - 预期的非限定 ID - #include <array> 编译错误
- libssh 问题编译问题未定义的错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- Visual Studio 2017问题编译了C 代码,而该代码则在Linux中编译
- 这个C++代码有什么问题?编译错误:调用“测试::测试(测试)”没有匹配函数
- 试图编译基本Boost PropertyTree示例时出现问题-编译错误.该怎么做
- 如何解决***缺少分隔符的问题.编译QT(或支持库)时