在C ++项目中设置R(C api)

问题描述 投票:1回答:1

我想在我自己的cpp项目中使用R-package(AlgDesign -https://github.com/jvbraun/AlgDesign/tree/master/src)的cpp函数。

我常用的IDE是Visual Studio 2015.我发现这个相关帖子Building R packages (C API) with Visual Studio(和How do I compile a dll with R and RCPP?)所以我在我的Windows 8.1上安装了MinGW和CodeBlocks IDE并重试。我在CodeBlocks中的“Project build options-> search directories-> compiler”中添加了“Rdir / include”路径。

但我仍然得到“未定义的引用_GetRNGstate”,这相当于MSVC“未解析的外部符号_GetRNGstate”。所以我想这个问题就像原来的提问者已经提到的那样缺少了lib。但我无法弄清楚哪一个。我的R-install目录中没有.lib文件。

此外,我不打算使用Rcpp或构建自己的R-package,我只想在我自己的cpp-project中访问SEXP FederovOpt(.. args)函数

编辑:让我们说我想按功能将AlgDesign src文件功能转移到一个空项目中。在某些时候,我会达到这个目的:

#include "wheeler.h"

#include <string.h>
#include <stdlib.h>
#include <Rinternals.h>
#include <Rdefines.h>
#include <R.h>
#include <Rmath.h>
#include <R_ext/RS.h>
#include <R_ext/Utils.h>

/* Permute **********************************************************
|   Randomly pemutes the n integers in a[] using the Fike
|   algorithm.  See Fike, "A permutation generation method"  The Computer
|   Journal, 18-1, Feb 75, 21-22.
*/

void Permute(
    int     *a,
    int     n
)
{
    int         i,
        j,
        temp;

    GetRNGstate();
    for (i = 1; i < n; i++) {
        j = (int)((double)(1 + i)*unif_rand());
        temp = a[j];
        a[j] = a[i];
        a[i] = temp;
    }
    PutRNGstate();
}

int main(){

return 0;

}

我将在R C API的Random.h中定义的3个未解析的外部void GetRNGstate(void)在R C API的Random.h中定义的R.c API void PutRNGstate(void)中定义的double unif_rand(void)

最后,我发现了这篇文章:https://www.codeproject.com/Questions/1192515/I-want-to-run-R-script-from-Cplusplus-code

所以当然,我正在搜索.lib文件。但是这个文件在Windows中不存在,我必须自己创建.lib文件。但我不知道如何。我找到了这个,但它很老了,目录完全不同:https://uploads.cosx.org/2009/12/Integrate-R-into-C.pdf

请你帮助我好吗?一个简单的“轻松使用makefile”或单个cmd命令不会帮助我,我无法理解。我之前从未使用过makefile,之前我从未构建过.lib。

c++ r
1个回答
0
投票

我看到两种可能的方法:

  1. 将R解释器嵌入到您的应用程序中,例如使用Rinside包。然后你可以调用包裹FederovOpt的R函数。
  2. FederovOpt函数包含了一些执行实际工作的普通C函数。它的主要任务是将这些C函数与R接口。如果您不使用R,否则您也可以提取这些C函数并直接使用它们。

使用哪种解决方案?如果您需要其他R功能,1。可能更容易。看看Rinside附带的例子。你可能不得不坚持使用mingw,最好是来自Rtools。如果这是您需要的唯一R功能,2。可能是要走的路。如果您使代码独立于R,则可以使用VS.有些例子可以做类似的事情,例如: https://github.com/zhanxw/libMvtnorm。在这两种情况下,您都必须遵守GPL。

为了使选项二更明确,我做了一个简单的测试:

  1. 下载FederovOpt.cwheeler.h
  2. 删除R特定标头的所有#includes。
  3. #include <math.h>#define添加TRUEFALSEs。
  4. 删除R特定函数ProgAllocProgDeallocFederovOpt
  5. 删除R特定函数调用R_CheckUserInterrupt()GetRNGstate()PutRNGstate()
  6. unif_rand()替换rand() / (RAND_MAX + 1.0)

生成的文件可以使用gcc编译,没有错误或警告。当添加一个main()时,甚至可以链接它而不需要R特定的库。在那里你将分配内存,调用FederovOptimize并再次释放内存。

顺便说一句,RNG当然比R的RNG差很多,但可能足以完成这项任务。使用C ++ 11,您当然可以获得更好的可能性。

© www.soinside.com 2019 - 2024. All rights reserved.