尝试从 R 调用 C++ 函数时出现致命错误

Fatal error when tring to call C++ function from R

我有一个名为 "file1.cpp" 的 C++ 函数,看起来像:

#include <cmath> 
#include <stdio.h> 
#include <RcppArmadillo.h> 
#include <boost/math/special_functions/gamma.hpp> 
#include <mpi.h> 
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
using namespace std;
using namespace arma;
using namespace boost::math;
const double PIVAL = std::acos(0.0)*2;
class function1
{
...
}
extern "C"
void functin2
{
...
}

我想从 R 函数中调用它。为此,我需要先编译它以获得 "file1.so",稍后我可以在 R 命令中使用它:

dyn.load("file1.so.so")

所以它 ubuntu 16.10 终端我写道:

$ R CMD SHLIB file1.cpp -O2 -larmadillo -llapack -lblas

当我按下回车键时,我会收到以下错误信息:

g++ -I/usr/share/R/include -DNDEBUG      -fpic  -g -O2 -fdebug-prefix-map=/build/r-base-rAT5Oi/r-base-3.3.1=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g  -c file1.cpp -o file1.o
file1.cpp:12:81: fatal error: RcppArmadillo.h: No such file or directory
 #include <RcppArmadillo.h>

我找不到该错误的解决方案。因此,我尝试从 Rstudio 内部调用 C++ 函数。我写了以下命令:

library(Rcpp)
library(RcppArmadillo)
sourceCpp("file1.cpp")
function2()

执行时我会得到这个错误:

file1.cpp:11:81: fatal error: RcppArmadillo.h: No such file or directory

有人知道如何解决吗?提前致谢。

此致,

请阅读 RcppArmadillo 上 许多 现有示例,在 Rcpp Gallery 或者,天堂禁止,在包文档中。

可以 当然只需调用 RcppArmadillo.package.skeleton() 并有一个工作包 为你创建 开始并放置你的本地变化.

看到这个:

R> setwd("/tmp")
R> RcppArmadillo::RcppArmadillo.package.skeleton("demoPkg")

Calling kitten to create basic package.
Creating directories ...
Creating DESCRIPTION ...
Creating NAMESPACE ...
Creating Read-and-delete-me ...
Saving functions and data ...
Making help files ...
Done.
Further steps are described in './demoPkg/Read-and-delete-me'.

Adding pkgKitten overrides.
Deleted 'Read-and-delete-me'.
Done.

Consider reading the documentation for all the packaging details.
A good start is the 'Writing R Extensions' manual.

And run 'R CMD check'. Run it frequently. And think of those kittens.


Adding RcppArmadillo settings
 >> added Imports: Rcpp
 >> added LinkingTo: Rcpp, RcppArmadillo
 >> added useDynLib and importFrom directives to NAMESPACE
 >> added Makevars file with Rcpp settings
 >> added Makevars.win file with RcppArmadillo settings
 >> added example src file using armadillo classes
 >> added example Rd file for using armadillo classes
 >> invoked Rcpp::compileAttributes to create wrappers
R> 

这会创建,_除其他外,这个文件:

// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*-

// we only include RcppArmadillo.h which pulls Rcpp.h in for us
#include "RcppArmadillo.h"

// via the depends attribute we tell Rcpp to create hooks for
// RcppArmadillo so that the build process will know what to do
//
// [[Rcpp::depends(RcppArmadillo)]]

// simple example of creating two matrices and
// returning the result of an operatioon on them
//
// via the exports attribute we tell Rcpp to make this function
// available from R
//
// [[Rcpp::export]]
arma::mat rcpparma_hello_world() {
    arma::mat m1 = arma::eye<arma::mat>(3, 3);
    arma::mat m2 = arma::eye<arma::mat>(3, 3);

    return m1 + 3 * (m1 + m2);
}


// another simple example: outer product of a vector, 
// returning a matrix
//
// [[Rcpp::export]]
arma::mat rcpparma_outerproduct(const arma::colvec & x) {
    arma::mat m = x * x.t();
    return m;
}

// and the inner product returns a scalar
//
// [[Rcpp::export]]
double rcpparma_innerproduct(const arma::colvec & x) {
    double v = arma::as_scalar(x.t() * x);
    return v;
}


// and we can use Rcpp::List to return both at the same time
//
// [[Rcpp::export]]
Rcpp::List rcpparma_bothproducts(const arma::colvec & x) {
    arma::mat op = x * x.t();
    double    ip = arma::as_scalar(x.t() * x);
    return Rcpp::List::create(Rcpp::Named("outer")=op,
                              Rcpp::Named("inner")=ip);
}

这应该足以让您继续前进。