我想在我自己的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。
我看到两种可能的方法:
Rinside
包。然后你可以调用包裹FederovOpt
的R函数。FederovOpt
函数包含了一些执行实际工作的普通C函数。它的主要任务是将这些C函数与R接口。如果您不使用R,否则您也可以提取这些C函数并直接使用它们。使用哪种解决方案?如果您需要其他R功能,1。可能更容易。看看Rinside附带的例子。你可能不得不坚持使用mingw,最好是来自Rtools。如果这是您需要的唯一R功能,2。可能是要走的路。如果您使代码独立于R,则可以使用VS.有些例子可以做类似的事情,例如: https://github.com/zhanxw/libMvtnorm。在这两种情况下,您都必须遵守GPL。
为了使选项二更明确,我做了一个简单的测试:
FederovOpt.c
和wheeler.h
。#include
s。#include <math.h>
和#define
添加TRUE
和FALSE
s。ProgAlloc
,ProgDealloc
和FederovOpt
R_CheckUserInterrupt()
,GetRNGstate()
和PutRNGstate()
。unif_rand()
替换rand() / (RAND_MAX + 1.0)
。生成的文件可以使用gcc
编译,没有错误或警告。当添加一个main()
时,甚至可以链接它而不需要R特定的库。在那里你将分配内存,调用FederovOptimize
并再次释放内存。
顺便说一句,RNG当然比R的RNG差很多,但可能足以完成这项任务。使用C ++ 11,您当然可以获得更好的可能性。