Добавление внешней библиотеки в пакет 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