Добавление внешней библиотеки в пакет R с использованием Rcpp

Я пытаюсь разработать пакет R, который использует библиотеку Sundials C для решения дифференциальных уравнений. Чтобы пользователь не мог установить библиотеку, я помещаю исходный код библиотеки в свой пакет.

Я положил все файлы заголовков из библиотеки в /inst/include/sundials-2.6.2 и .c файлы в src/sundials-2.6.2 моей папки пакета.

Из моего чтения SO сообщений на эту тему, sourceCpp кода в нескольких файлах (например, отдельные .h а также .cpp файлы должны работать, если они структурированы, чтобы быть частью пакета. Я пытаюсь запустить файл примера кода из пакета Sundials

Мой код (только начальная часть) выглядит примерно так

#include <Rcpp.h>

#include "../inst/include/sundials-2.6.2/cvode/cvode.h"             /* prototypes for CVODE fcts., consts. */
#include "../inst/include/sundials-2.6.2/nvector/nvector_serial.h"  /* serial N_Vector types, fcts., macros */
#include "../inst/include/sundials-2.6.2/cvode/cvode_dense.h"      /* prototype for CVDense */
#include "../inst/include/sundials-2.6.2/sundials/sundials_dense.h" /* definitions DlsMat DENSE_ELEM */
#include "../inst/include/sundials-2.6.2/sundials/sundials_types.h" /* definition of type realtype */

Но я получаю ошибку

fatal error: sundials/sundials_nvector.h: No such file or directory

Я делаю пример чего-то подобного, сделанного в следующих репозиториях GitHub

Rcppsundials - https://github.com/AleMorales/RcppSundials.R/blob/master/src/cvode.cpp

который вызывает файлы заголовков, используя

#include <cvodes/cvodes.h>           // CVODES functions and constants
#include <nvector/nvector_serial.h>  // Serial N_Vector
#include <cvodes/cvodes_dense.h>     // CVDense

и включил заголовочные файлы под /inst/include/ папка.

Это первый пакет, который я пытаюсь разработать, и я не слишком широко использовал C/C++, поэтому в том, как я пытаюсь скомпилировать эту программу, может быть что-то очень глупое.

Еще одно замечание: мне удалось установить и запустить пример на моей машине с OSX, но в настоящее время я работаю с машиной с Windows, на которой не установлены солнечные часы. Это имеет Rtools установлен, так что я могу скомпилировать и запустить пример Rcpp программы.

Спасибо SN

1 ответ

Решение

Связывание с внешней библиотекой должно быть выполнено со следующей настройкой:

R/
inst/
  |- include/
     |- sundials/ 
  |- header.h
src/
  |- sundials/
  |- Makevars
  |- Makevars.win
  |- action.cpp
man/
DESCRIPTION
NAMESPACE

Затем добавьте следующее:

PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
PKG_CPPFLAGS =  -I../inst/include/ -I src/sundials

Как для Makevars а также Makevars.win

Здесь я решил удалить номера версий солнечных часов из имен папок.

редактировать

Я сделал исправления, необходимые для компиляции пакета:

https://github.com/sn248/Rcppsbmod/pull/1

Замечания:

Структура была:

inst/
  |- include/
     |- sundials/  
        |- arkode/
        .....
        |- nvector/  
        |- sundials/ 
  |- header.h

Это привело бы к тому, что включаемые выражения были бы:

#include <sundials/cvodes/cvodes.h>           // CVODES functions and constants
#include <sundials/nvector/nvector_serial.h>  // Serial N_Vector
#include <sundials/cvodes/cvodes_dense.h>     // CVDense

Я изменил это так, чтобы:

inst/
  |- include/
     |- arkode/
     .....
     |- nvector/  
     |- sundials/ 
  |- header.h

Итак, заявления всегда будут:

#include <cvodes/cvodes.h>           // CVODES functions and constants
#include <nvector/nvector_serial.h>  // Serial N_Vector
#include <cvodes/cvodes_dense.h>     // CVDense
Другие вопросы по тегам