我查看了多个地方(例如,编写 R 扩展和使用 Rcpp 编写包),但未能找到解决我的问题的简单示例。
我需要的是能够使用多个 cpp 源文件。一个简单的例子是:
假设我有一对文件:啊,a.cpp,它定义了函数 f(它为我准备了一些数据)。
然后我有包含 ah 的 b.cpp 它所做的是定义一个导出到 R 的函数 g(即这是唯一包含 Rcpp.h 的文件)。此函数调用 f,然后返回它从 f 创建的数据框。
我需要一种方法来编译 a.cpp,将其链接到 b.cpp(这样它就可以调用 f),然后运行 g。
实际上,不是一对a.cpp,而是我有一个外部制作的项目(在linux上使用makefile)。但是,同样的文件也应该在 Windows 上编译并链接到 b.cpp(我知道它们使用 g++ 正确编译)。当我创建 makefile 时,我添加了几个标志(几个 -I 标志来定义包含目录和几个 -D 标志来定义行为)。
我不能真正触及原始项目,只有 bc 和添加外部文件。
我一直在寻找一种简单的方法来实现这一点。我看到的最接近的是创建一个包,其中包含使用 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) 。
我宁愿找到一个更优雅(而且不太复杂)的解决方案。