gpt4 book ai didi

c++ - 在 rcpp 中使用多个源文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:56 25 4
gpt4 key购买 nike

我查看了多个地方(例如 Writing R ExtensionsWriting 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 的文件。不过,这种方法存在一些问题:

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

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

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

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

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

最佳答案

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

后续使用可以简单地拥有一个LinkingTo: mypackage,或者Depends属性。在 Rcpp Gallery 或此处查找示例和大量使用 RcppArmadillo 的示例——没有复制文件。

关于c++ - 在 rcpp 中使用多个源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19384376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com