繁体   English   中英

当我从另一个.cpp文件调用cpp函数时出错

[英]Error when I call cpp function from another .cpp file

我试图从另一个.cpp文件调用c ++函数。 我使用了.h标头。 见下文我做了什么。

我有一个fh文件:

#ifndef PACKAGENAME_ADD_H
#define PACKAGENAME_ADD_H

#include <Rcpp.h>
Rcpp::NumericVector f(Rcpp::NumericVector x) ;

#endif

f.cpp文件:

#include <Rcpp.h>
using namespace Rcpp;

NumericVector f(NumericVector x) {
  return x * 2;
}

g.cpp文件:

#include <Rcpp.h>
#include <f.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector g(NumericVector x) {
  return f(x);
}

这三个文件位于同一文件夹中,运行g.cpp时出现此错误:

Rcpp::sourceCpp('~/g.cpp')

dyn.load中的错误(“ /tmp/Rtmpdu4AWp/sourceCpp-x86_64-pc-linux-gnu-0.12.17/sourcecpp_260f5e1a9ebc/sourceCpp_9.so”):无法加载共享对象'/ tmp / Rtmpdu4AWp / sourceCpp-x86_64-pc -linux-gnu-0.12.17 / sourcecpp_260f5e1a9ebc / sourceCpp_9.so':/tmp/Rtmpdu4AWp/sourceCpp-x86_64-pc-linux-gnu-0.12.17/sourcecpp_260f5e1a9ebc/sourceCpp_9.so:未定义的符号:_Z1En14E14R

有人能帮我吗? 我在ubuntu 18.04上工作,我有R 3.4.4版本。

我最熟悉的在Rcpp处理此问题的Rcpp是创建一个程序包。 正如Ralf Stubner指出的那样,在您发表在原始帖子中的情况下,这并不是必须的。 g.cpp fh周围的方括号( <>g.cpp为引号( "" )后,您的代码可以使用sourceCpp()对我进行编译:

Rcpp::sourceCpp("g.cpp")
g(1:10)
# [1]  2  4  6  8 10 12 14 16 18 20

(有关详细信息,请参见“ Rcpp属性”插图的 1.10节)。

但是,如果最终需要多个.cpp文件进行编译(即,不仅依赖于另一个实现的文件),那么创建包的方法是。 这听起来可能涉及或令人生畏,但是使用Rcpp提供的工具,它确实非常简单。 这是我将您的代码转换为软件包的步骤:

  1. 从R运行Rcpp::Rcpp.package.skeleton("SOanswer", example_code = FALSE)
  2. 删除文件Read-and-delte-me
  3. 将原始帖子中的C ++文件添加到src/文件夹中(只需进行一次较小的编辑-将g.cpp fh周围的方括号( <>g.cpp为引号( "" )。
  4. 在R中,运行Rcpp::compileAttributes("SOanswer/")devtools::install("SOanswer/")

然后它应该可以很好地编译,并且可以从R运行g()

SOanswer::g(1:10)
# [1]  2  4  6  8 10 12 14 16 18 20

我要说的是,我将在第0步添加一个内容:在https://cran.r-project.org/package=Rcpp上阅读渐近线,尤其是Rcpp Introduction和Rcpp Package渐近线。 您也可以在注释中查看这个可爱的包示例 ,其中src/有标头,由coatless提供。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM