我正在尝试开发一个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机器上安装并运行示例,但是当前我正在未安装Sundials的Windows机器上工作。它确实安装了Rtools,因此我可以编译并运行示例Rcpp程序。

谢谢
SN

最佳答案

外部库链接应使用以下设置进行:

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


MakevarsMakevars.win

在这里,我选择从文件夹名称中删除日d版本号。

编辑

我已经完成了编译软件包所需的修复:

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

注意:

结构为:

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


这将迫使include语句为:

#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

08-24 18:35