C++ 在rcpp中使用多个源文件

C++ 在rcpp中使用多个源文件,c++,r,rcpp,C++,R,Rcpp,我查看了多个地方(例如和),但没有找到解决问题的简单示例。 我需要的是能够使用多个cpp源文件。 一个简单的例子是: 假设我有一对文件:a.h,a.cpp,它们定义了函数f(它为我准备了一些数据)。 然后我有b.cpp,其中包括a.h。它所做的是定义一个导出到R的函数g(即,这是唯一包含Rcpp.h的文件)。此函数调用f,然后返回从f创建的数据帧。 我需要一种方法来编译a.cpp,将其链接到b.cpp(这样它就可以调用f),然后运行g. 实际上,我有一个外部制作的项目(在linux上使用make

我查看了多个地方(例如和),但没有找到解决问题的简单示例。
我需要的是能够使用多个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标志用于定义include目录,几个-D标志用于定义行为)。
但我无法真正接触到原始项目,只有b.c和添加外部文件。

我在寻找一个简单的方法来实现这一点。我看到的最近的一个例子是使用Rcpp.package.skeleton创建一个包含文件的包。不过,这种方法存在几个问题:

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

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

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

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


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

    您错过了将头文件安装在
    mypackage/inst/include
    中的可能性,因此它们被安装在
    mypackage/include


    后续使用可以简单地使用
    链接到:mypackage
    ,或
    dependens
    属性。例如,在Rcpp图库或此处查看大量RcppArmadillo使用示例——无复制文件。

    根据我的理解,链接仅在其他文件位于R包中时有效。在我的例子中,cpp文件不是,它们在一个单独的目录中(我有一个visual studio项目和一个linux makefile)。您未能解释为什么不能创建一个库。如何创建一个与R兼容的库?在windows中,我通常使用visual studio,在linux中,我使用自己的逻辑(没有与R相关的标志)创建.a。我只是使用一个普通的linux makefile来创建一个普通的.a库吗?这就是问题所在。一个普通的图书馆够了吗?还是我需要一种特殊的方式来这样做?i、 假设我定期编译并创建一个.a库(即与R无关)。我是否只需要对任何预编译的.a库执行Sys.setenv(“PKG\u cxflags”=“-L/myPath-lmylib-Imypath\u to\u include”)操作?是的
    PKG\u cxflags
    用于包含(您的最后一部分),而
    PKG\u LIBS
    用于库(即
    -l..
    -l..
    )。