【发布时间】:2013-10-15 14:53:31
【问题描述】:
我查看了多个地方(例如 Writing R Extensions 和 Writing a package using Rcpp),但未能找到解决我的问题的简单示例。
我需要的是能够使用多个 cpp 源文件。
一个简单的例子是:
假设我有一对文件:a.h、a.cpp,它们定义了函数 f(它为我准备了一些数据)。
然后我有 b.cpp 其中包括 a.h.它所做的是定义一个导出到 R 的函数 g(即,这是唯一包含 Rcpp.h 的文件)。此函数调用 f,然后返回它从 f 创建的数据框。
我需要一种方法来编译 a.cpp,将其链接到 b.cpp(以便它可以调用 f)然后运行 g。
在实践中,我有一个我在外部制作的项目(在 linux 上使用 makefile),而不是一对 a.cpp,a.h。但是,同样的文件也应该在 Windows 上编译并链接到 b.cpp(我知道它们使用 g++ 正确编译)。当我创建 makefile 时,我添加了几个标志(几个 -I 标志来定义包含目录和几个 -D 标志来定义行为)。
不过,我无法真正触及原始项目,只有 b.c 和添加外部文件。
我一直在寻找一种简单的方法来实现这一点。我看到的最接近的是创建一个包,其中包含使用 Rcpp.package.skeleton 的文件。但是,这种方法存在几个问题:
我需要参考相关文件,但 Rcpp.package.skeleton 复制了它们。大多数 cpp 文件(即与 R 相关的所有注释)属于不同的项目,该项目在我们的存储库中有自己的位置,我不想碰它们(我也不能使用软链接,因为我们使用 Windows 的混合环境和 linux)。
我不想创建一个单独的包,因为它对于我的简单需求来说似乎有点复杂
我看到可以链接外部库,但我不知道如何以与 R 兼容的方式编译它(尤其是在 Windows 中)。
到目前为止,我发现的唯一简单的解决方案是将所有相关的 cpp 文件直接包含到与 R 相关的 cpp 中(即在 b.cpp 的开头添加一个#include "a.cpp",因为文件列表实际上并没有更改,我不介意每次都编译所有内容)并在使用 sourceCpp 之前执行 Sys.setenv("PKG_CXXFLAGS"=myflags)。
我更愿意找到一个更优雅(而且不太复杂)的解决方案。
【问题讨论】: