[英]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_OUT
和Class -> 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.