2016-11-11 71 views
0

调用C++函数时,我有一个C++函数称为“file1.cpp”,看起来像:致命错误特林来自R

#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 

当我按下进入我会得到follwing错误消息:

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++函数。我写的follwing命令:

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

当执行它,我会得到这个错误:

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

任何人有关于如何解决它的想法?提前致谢。

最好的问候,

回答

2

请阅读一些关于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); 
} 

和t帽子应该足以让你去。

+0

它的作品很神奇。谢谢德克。我花了很多天的时间来弄清楚。但是,我会得到一个新的错误:致命错误:boost/math/special_functions/gamma.hpp:没有这样的文件或目录 #include emadalamoudi

+0

阅读BH包和研究使用它的包。可能会像添加单个LinkingTo一样简单。而且,如果我可以的话,**也在Rcpp图库中清楚地解释过**。不要试图重新发明每一个轮子。 –

+0

我会德克,非常感谢您的帮助。 – emadalamoudi