用户在Rcpp中编写的标题/名称空间中的函数声明

时间:2018-08-28 02:31:51

标签: c++ rcpp

这个问题实际上是对上一个问题Calling 'mypackage' function within public worker的跟进。而且我怀疑通过询问可以得到更深刻的理解。

错误是

  

无法加载共享对象”在“ ParallelExample.so”中

我想做的是在R-package中内部调用Cpp函数。为此,我编写了一个头文件并将其添加到src目录,并在此头中定义了名称空间。编译错误发生于以下代码:

也就是说,我已经针对这个问题提出了两种解决方案。

  1. 在头文件中定义函数,而不仅仅是声明它。
  2. 将名称空间留在头文件之外。

从我在该主题上进行的cpp研究来看,它似乎在Rcpp之外是可行且普遍的(在头文件的名称空间中声明一个函数)。哪个让我想知道这是Mac编译器还是Rcpp的一个功能。

首先,cpp文件:

#include <RcppArmadillo.h>
#include "ExampleInternal.h"
// [[Rcpp::export]]
double myfunc(arma::vec vec_in){

  int Len = arma::size(vec_in)[0];
  return (vec_in[0] +vec_in[1])/Len;
}

第二个Cpp:

#include <RcppArmadillo.h>
#include <RcppParallel.h>
#include "ExampleInternal.h"
#include <random>

using namespace RcppParallel;

struct PARALLEL_WORKER : public Worker{

  const arma::vec &input;
  arma::vec &output;

  PARALLEL_WORKER(const arma::vec &input, arma::vec &output) : input(input), output(output) {}

  void operator()(std::size_t begin, std::size_t end){


    std::mt19937 engine(1);

    for( int k = begin; k < end; k ++){
      engine.seed(k);
      arma::vec index = input;
      std::shuffle( index.begin(), index.end(), engine);

      output[k] = ExampleInternal::myfunc(index);
  }
}

};

// [[Rcpp::export]]
arma::vec Parallelfunc(int Len_in){

  arma::vec input = arma::regspace(0, 500);
  arma::vec output(Len_in);

  PARALLEL_WORKER  parallel_woker(input, output);
  parallelFor( 0, Len_in, parallel_woker);
  return output;
}

最后还有一个内部头文件,也位于src目录中:

#ifndef EXAMPLEINTERNAL_H
#define EXAMPLEINTERNAL_H

#include <RcppArmadillo.h>
#include <Rcpp.h>

namespace ExampleInternal{

double myfunc(arma::vec vec_in);

}

#endif

1 个答案:

答案 0 :(得分:2)

您声明并调用函数ExampleInternal::myfunc,然后在全局命名空间中定义函数myfunc。这不匹配,并且我很确定您未显示的其余错误消息表明在ExampleInternal::myfunc文件中找不到so

解决方案:在定义函数时使用相同的名称空间:

#include <RcppArmadillo.h>
#include "ExampleInternal.h"
namespace ExampleInternal {

double myfunc(arma::vec vec_in){

  int Len = arma::size(vec_in)[0];
  return (vec_in[0] +vec_in[1])/Len;
}

}

我还删除了注释以导出功能。顺便说一句,不要同时包含RcppAramdillo.hRcpp.h