簡體   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