gpt4 book ai didi

c++ - rcpp First 编译麻烦

转载 作者:搜寻专家 更新时间:2023-10-31 00:37:51 24 4
gpt4 key购买 nike

我最近从亚马逊下载了 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

前两个的结果应该被赋值并导出到 shell。您在这里所做的“分配并忘记”。

list 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_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 关于inline和Attributes。两者都好得多;使用那些。

关于c++ - rcpp First 编译麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19140348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com