带有 Rcpp 头文件的 c++ 文件的编译步骤
Posted
技术标签:
【中文标题】带有 Rcpp 头文件的 c++ 文件的编译步骤【英文标题】:Compilation steps for a c++ file with Rcpp header file 【发布时间】:2018-06-29 04:20:07 【问题描述】:我正在 gedit 上尝试此代码,并在终端上通过 g++ 编译器进行编译。
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
double sumC(NumericVector x)
int n = x.size();
double total = 0;
for(int i = 0; i < n; ++i)
total += x[i];
return total;
// [[Rcpp::export]]
double meanC(NumericVector x)
return sumC(x) / x.size();
头文件发生错误。
致命错误:Rcpp.h:没有这样的文件或目录
我是这样编译的:g++ -I /usr/ r1.cpp -o c0 -L /usr/ -lRcpp 我也试过:g++ -I /usr/lib/R/site-library/Rcpp/include/ r1.cpp -o c0 -L /usr/lib/R/site-library/Rcpp/libs/ -lRcpp 。然后得到像致命的错误
error: R.h: No such file or directory #include <R.h>
Locations:
locate Rcpp.h:/usr/lib/R/site-library/Rcpp/include/Rcpp.h
locate R.h:/usr/share/R/include/R.h
我也尝试过制作文件。 我的制作文件:
all:
g++ rcpp.cpp -o obj
compile:
我已将所有依赖的头文件附加到一个文件夹中。仍然收到 Rcpp 的错误。
有人知道如何通过终端编译吗?
【问题讨论】:
您是否正在尝试将此 C++ 文件编译成可以运行的程序?如果没有main()
,那将无法工作。除此之外yesterday’s answer 仍然适用。
:***.com/questions/45296381/….
在那个问题中,来自 Rcpp 的帮助函数用于编译和链接上述 C++ 文件并将其加载到正在运行的 R 进程中。这一切的预期结果是什么?
我担心你会继续误解如何它是如何工作的以及如何它应该被使用。从 R,在这两种情况下。也许尝试查看更新后的Rcpp Introduction。
【参考方案1】:
你可以编译这个文件
g++ -I/usr/share/R/include -I/usr/lib/R/site-library/Rcpp/include -c rcpp.cpp -o rcpp.o
但是,我不明白您为什么要这样做。为了使此类 C++ 函数可以从 R 中调用,还需要几个额外的步骤:
C++ 包装函数转换为基于 R 的SEXP
的接口。
通过 .Call()
调用 C++ 包装函数的 R 包装函数。
将所有目标文件链接到 R 可以加载的动态库中。
将库和 R 包装函数加载到 R 中。
所有这些都是通过 sourceCpp()
或在使用 Rcpp 的包的上下文中使用 Rcpp::compileAttributes()
时自动化的,c.f. attributes 和 packages 上的小插曲。
【讨论】:
我是这个领域的新手,第一次尝试从 Cpp 调用 R 函数。 g++ -I/usr/share/R/include -I/usr/lib/R/site-library/Rcpp/include -c rcpp.cpp -o rcpp.o i> 这将创建一个 rcpp.o 文件。该文件是编译和链接之间的目标文件。它不能用 ./rcpp.o 执行 @Aswathy 是的,这是命令的结果。这是一个陈述还是一个(隐藏的)问题? :它的工作并创建一个目标文件。但也需要创建 -L 用于链接。我认为只有我可以将目标文件转换为可执行文件。 @9113303 如果您想要一个可以直接调用的可执行文件,那么您将不得不做更多的事情。 RInside 对此有所帮助。一旦您解释了您要做什么,我们也可以帮助您。见How to Ask。以上是关于带有 Rcpp 头文件的 c++ 文件的编译步骤的主要内容,如果未能解决你的问题,请参考以下文章