使用rcpp的多个源文件

时间:2013-10-15 14:53:32

标签: c++ r rcpp

我查看了多个地方(例如Writing R ExtensionsWriting a package using Rcpp)但未找到问题的简单示例。
我需要的是能够使用多个cpp源文件。 一个简单的例子是:
假设我有一对文件:a.h,a.cp​​p定义函数f(为我准备一些数据)。
然后我有b.cpp,其中包括a.h.它的作用是定义一个导出到R的函数g(即这是唯一包含Rcpp.h的文件)。该函数调用f,然后返回它从f创建的数据框。

我需要一种方法来编译a.cpp,将它链接到b.cpp(所以它可以调用f)然后运行g。
在实践中,而不是一对a.cpp,a.h我有一个外部项目(在linux上使用makefile)。但是,相同的文件应该编译并链接到Windows上的b.cpp(我知道它们使用g ++正确编译)。当我创建makefile时,我添加了几个标志(几个-I标志用于定义包含目录,多个-D标志用于定义行为)。
我不能真正触摸原始项目,只有b.c并添加外部文件。

我一直在寻找一种简单的方法来实现这一目标。我看到的最接近的是创建一个包,其中包含使用Rcpp.package.skeleton的文件。但是这种方法存在一些问题:

  1. 我需要引用相关文件,但Rcpp.package.skeleton会复制它们。大多数cpp文件(即与R相关的所有注释)属于一个不同的项目,它在我们的存储库中有自己的位置,我不想触摸它们(我也不能使用软链接,因为我们使用windows的混合环境和linux)。

  2. 我不想创建一个单独的包,因为它似乎对我的简单需求有点复杂

  3. 我看到可以链接外部库但我不知道如何以与R兼容的方式编译它(特别是在Windows中)。

    我到目前为止找到的唯一简单的解决方案是将所有相关的cpp文件直接包含在R相关的cpp中(即在b.cpp的开头添加一个#include“a.cpp”,因为文件列表不会真的改变,我不介意每次都编译)并在使用sourceCpp之前做一个Sys.setenv(“PKG_CXXFLAGS”= myflags)。

    我更愿意找到更优雅(而不是太复杂)的解决方案。

1 个答案:

答案 0 :(得分:1)

您错过了在mypackage/inst/include中添加头文件的可能性,以便它们安装在mypackage/include中。

后续使用可以只有LinkingTo: mypackageDepends属性。查看示例和Rcpp图库中的众多RcppArmadillo使用示例或此处 - 无复制文件。