gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:28:26 27 4
gpt4 key购买 nike

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

我有一个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')

Error in dyn.load("/tmp/Rtmpdu4AWp/sourceCpp-x86_64-pc-linux-gnu-0.12.17/sourcecpp_260f5e1a9ebc/sourceCpp_9.so") : unable to load shared object '/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: undefined 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 提供的工具,真的很简单。以下是我将您的代码转换为程序包所采取的步骤:

  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/")

然后它应该可以很好地编译,你可以运行 g()来自 R:

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 examplesrc/ 中包含 header 的包由 coatless 提供在评论中。

关于c++ - 从另一个 .cpp 文件调用 cpp 函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52264383/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com