带有 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 &lt;R.h&gt;

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++ 文件的编译步骤的主要内容,如果未能解决你的问题,请参考以下文章

C++ 预编译头文件已禁用

预编译标准库头文件 - C++

使用带有头文件的 cpp 文件编写 C++ 程序

编译大型头文件 C++

C++ 头文件引用

预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)