Ошибка при вызове функции cpp из другого файла .cpp - PullRequest
0 голосов
/ 10 сентября 2018

Я пытался вызвать функцию c ++ из другого файла .cpp. Я использовал заголовок .h. Смотри ниже, что я сделал.

У меня есть f.h файл:

#ifndef PACKAGENAME_ADD_H
#define PACKAGENAME_ADD_H

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

#endif

f.cpp file:

#include <Rcpp.h>
using namespace Rcpp;

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

g.cpp file:

#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: неопределенный символ: _Z1fN4Rcpp6VectorILi14ENS_15PreserveStorageEEE

Может кто-нибудь мне помочь? Я работаю на Ubuntu 18.04 и у меня версия R 3.4.4.

1 Ответ

0 голосов
/ 11 сентября 2018

Я больше всего знаком с этой проблемой в контексте Rcpp, создав пакет.В случае, если вы представите в оригинальном сообщении, как указал Ральф Стубнер , это на самом деле не нужно;после замены скобок (<>) вокруг f.h в g.cpp на кавычки ("") ваш код отлично скомпилирован для меня с помощью sourceCpp():

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

(подробности см. в разделе1.10 виньетки Rcpp Attributes ).

Однако, если вам в конечном итоге понадобится несколько файлов .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 Введение и Rcpp Package.Вы также можете проверить этот прекрасный пример пакета с заголовками в src/, предоставленного coatless в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...