繁体   English   中英

编译Rcpp软件包

[英]Compiling the Rcpp package

背景

我的公司正在考虑与RStudio一起将R引入我们的工作环境。 作为安全检查的一部分,我们必须在程序包中编译每个不同的C / C ++文件,以扫描可能的安全漏洞。 我知道二进制文件可用,我真的希望我可以使用它们,但是我们必须自己编译。 我大约5年前没有R的经验,也没有使用c ++的经验。 我正在尝试编译Rcpp C ++代码,但我不知道这样做是否可行。

我尝试过的

我首先尝试使用VisualStudio进行编译,但发现它不符合c99。 然后,我尝试了cygwin,但它不支持w_strings 我现在已经安装了ubuntu,并且在编译时收到很多“未定义的引用”错误。 我知道(或至少我相信)Rcpp旨在帮助在R中使用C ++。鉴于此,我什至可以将其中一些文件编译为独立的二进制文件吗?

我在编译api.cpp时得到的一些空引用(我相信完整的列表会比局部列表提供更多的信息,因为它很长):

undefined reference to 'R_NilValue'
undefined reference to 'REprintf'
undefined reference to 'R_FlushConsole'
undefined reference to 'Rf_install'
undefined reference to 'Rf_setAttrib'
undefined reference to 'Rf_mkChar'
undefined reference to 'SET_STRING_ELT'
undefined reference to 'Rf_allocVactor'
undefined reference to 'R_ExternalPtrAddr'
etc...

现在,我认为这是行不通的,因为我没有按照预期的方式使用Rcpp并传递任何值。 如果我尝试使用另一个使用Rcpp的R包,是否可以编译Rcpp C ++文件并保留二进制文件? 除了将二进制文件从CRAN中删除,我还能做些什么?

这实际上是一个相对简单的解决方案,尽管大多数人都可以下载二进制文件,所以这无关紧要,但我在其他任何地方都找不到。

1)从CRAN下载(不适用于我的apt-get)

2)须藤tar -xvf Rcpp_X.XX.X.tar.gz

3)R CMD安装Rcpp

这将为您创建二进制.SO。

快速的:

  • 拼写为Rcpp,即大写R,后跟小写cpp。 像文件扩展名。

  • 您英勇地假设Rcpp可以由Visual Studio [1]编译。 不能[2]。 我们已经对此进行了数年的记录 ,即自2008年末重新启动Rcpp以来的最低记录。

  • 请参阅每次下载Rcpp时随附的Rcpp FAQ中的条目1.3和2.9。

  • 与Cygwin同上。 R不在Cygwin下构建。 因此,请勿尝试在Cygwin下构建Rcpp。

  • 最后但并非最不重要的一点:不确定您对Rcpp文档的关注程度以及您的想法。 它不是为您将R脚本转换为Windows二进制文件的神奇小马。 没有这样的小马。 Rcpp是R的扩展程序包,它使R和C ++互换更加容易。 不多不少。 到目前为止,这里有数百个Rcpp问题,因此请四处看看。

这几乎几乎肯定也是一个可以解决的重复问题,但我现在没有时间看。

[1]请注意此处的单数形式,不是复数形式的“ Visual Studios”,或者您所指的不是太平洋西北地区的公司提供的编译器和IDE。

[2]除非您是真正的Windows C ++专家,否则愿意或多或少地构建自己的构建系统[3]

[3]这主要是由于R无法使用VS工具链构建。 $神知道人们已经尝试过了。 归咎于OS /编译器供应商没有遵循使R Core团队能够在Windows(通过gcc),OS X和基本上所有Unix风格(包括所有Linux变体)上提供一致产品的标准。

我尝试在Visual Studio上编译rcpp ,并指出5个链接错误,例如

未解析的外部符号Rf_allocVector和未解析的外部符号Rf_length

您知道我制作的文件仍需要添加到项目中以解决链接错误吗?

我确实克服了编译错误。 我没有声称我有完整的答案,但是由于我的声誉得分不够高,因此无法将其添加为评论。

我对OUT -> RCPP_TYPE_OUTClass -> RCPP_TYPE_Class OUT -> RCPP_TYPE_OUT进行了区分大小写的全字替换。

由于我通常将警告视为错误,因此添加了预处理器macro

#define _CRT_SECURE_NO_WARNINGS
#define __INTEL_COMPILER 

我也忽略了警告4996 ,并将size_t转换为一个文件中的int

在包含rcpp.h之前,我对宏ERROR,min和max使用#undef

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM