我试图从另一个.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版本。
我最熟悉在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
提供的工具,它真的很简单。以下是我将代码转换为包的步骤:
Rcpp::Rcpp.package.skeleton("SOanswer", example_code = FALSE)
Read-and-delte-me
。src/
文件夹中(只有一个小编辑 - 将<>
中f.h
周围的括号(g.cpp
)更改为引号(""
))。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。