2013-10-15 33 views
2

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

在rcpp中使用多个源文件

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

我正在寻找一种简单的方法来完成此操作。我看到的最接近的是创建一个包含使用Rcpp.package.skeleton的文件的包。有几个问题这种方法虽然:

  1. 我需要参考相关的文件,但Rcpp.package.skeleton复制它们。大多数cpp文件(即与R有关的所有记事)属于不同的项目,它在我们的仓库中有自己的位置,我不想去碰它们(我也不能使用软链接,因为我们使用混合的Windows环境和linux)。

  2. 我不喜欢,因为它似乎是我的简单的需求

我看到它是可以链接外部库有点复杂创建一个单独的包,但我不知道如何以与R兼容的方式编译它(特别是在Windows中)。

唯一的简单的解决办法,我发现到目前为止是直接包括所有相关的cpp文件转换为R相关的CPP(即b.cpp的开始,因为文件的列表中添加的#include“a.cpp”不会真的改变,我不介意每次编译的东西)并在使用sourceCpp之前执行Sys.setenv(“PKG_CXXFLAGS”= myflags)。

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

回答

1

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

随后的使用可以简单地具有LinkingTo: mypackageDepends属性。查找示例以及Rcpp库中或此处的许多RcppArmadillo使用示例 - 无复制文件。

+0

从我的理解LinkingTo只适用于其他文件在R包中。在我的情况下,CPP文件不是,他们在一个单独的目录(为此我有一个Visual Studio项目和Linux的makefile文件)。 –

+0

你没有解释为什么你不能只创建一个库。 –

+0

如何创建与R兼容的库?在Windows中,我通常使用visual studio,并在linux中使用自己的逻辑创建一个.a(没有R相关标志)。我只使用常规的linux makefile来创建一个常规的.a库吗? –