背景
我的公司正在考虑将R与RStudio一起带入我们的工作环境。作为安全检查的一部分,我们必须编译包中的每个不同的C / C ++文件,以扫描可能的安全漏洞。我知道二进制文件是可用的,我真的希望我可以使用它们,但我们必须自己编译。我从大约5年前就没有R经验和一点c ++经验。我正在尝试编译Rcpp C ++代码,我不知道这是否可行。
我试过的
我首先尝试使用VisualStudio进行编译,发现它不符合c99。然后我尝试了cygwin并且它不支持w_strings
。我现在已经安装了ubuntu,并且在编译时遇到了很多“未定义的引用”错误。我知道(或者至少我相信)Rcpp旨在帮助在R中使用C ++。鉴于此,我是否可以将这些文件中的一些编译为独立的二进制文件?
我在编译api.cpp
时得到的一些空引用(我不相信完整列表会提供比partial更多的信息,因为它很长):
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)sudo tar -xvf Rcpp_X.XX.X.tar.gz
3)R CMD INSTALL Rcpp
这将为您创建二进制.SO。
快速的:
所有这一切也几乎肯定是一个可以关闭的重复问题,但我现在没时间看。
[1]注意这里的单数,它不是复数“Visual Studios”,或者你指的是太平洋西北地区公司的编译器和IDE以外的东西。
[2]除非你是一个真正的C ++ - on-Windows专家,并愿意或多或少地建立你自己的构建系统[3]
[3]所有这一切主要是由于R无法使用VS工具链构建。并且美元知道人们已经尝试过。这里的责任在于操作系统/编译器供应商,因为它没有遵循标准,这些标准使R Core团队能够在Windows(通过gcc),OS X以及基本上所有Unix版本(包括所有Linux变体)上提供一致的产品。
我尝试在Visual Studio上编译rcpp
,并且达到了5个链接错误,例如
未解析的外部符号Rf_allocVector和未解析的外部符号Rf_length
你知道我制作的文件还需要添加到项目中来解决链接错误吗?
我确实克服了编译错误。我没有声称我有完整的答案,但我无法将其添加为评论,因为我的声誉得分不够高。
我做了一个区分大小写的替换OUT -> RCPP_TYPE_OUT
和Class -> RCPP_TYPE_Class
。
由于我通常将警告视为错误,因此我添加了预处理器macro
#define _CRT_SECURE_NO_WARNINGS
#define __INTEL_COMPILER
我也忽略了警告4996,并在一个文件中将size_t
输入int
。
在包括rcpp.h
之前,我使用#undef
作为宏ERROR,min和max。