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

问题描述 投票:2回答:1

我试图从另一个.cpp文件调用c ++函数。我用过.h标题。看下面我做了什么。

我有一个f.h文件:

#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:unfined defined symbol:_Z1fN4Rcpp6VectorILi14ENS_15PreserveStorageEEE

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

c++ rcpp
1个回答
3
投票

我最熟悉在Rcpp上下文中处理这个问题的方法是创建一个包。如果您出现在原始帖子中,正如Ralf Stubner所指出的那样,它并不是必需的;将<>中的f.h周围的括号(g.cpp)更改为引号("")之后,使用sourceCpp()为我编译的代码很好:

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

(有关详细信息,请参阅Rcpp Attributes vignette的第1.10节)。

但是,如果您最终需要编译多个.cpp文件(即,不仅仅依赖于另一个文件中的实现),那么就要创建一个包。这可能听起来很恐怖或令人生畏,但是使用Rcpp提供的工具,它真的很简单。以下是我将代码转换为包的步骤:

  1. 从R,运行Rcpp::Rcpp.package.skeleton("SOanswer", example_code = FALSE)
  2. 删除文件Read-and-delte-me
  3. 将原始帖子中的C ++文件添加到src/文件夹中(只有一个小编辑 - 将<>f.h周围的括号(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 vignettes。您还可以在评论中查看this lovely example提供的带src/标题的包装的coatless

© www.soinside.com 2019 - 2024. All rights reserved.