编译Rcpp包

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

背景

我的公司正在考虑将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。

c++ r rcpp
2个回答
6
投票

快速的:

  • 拼写为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]除非你是一个真正的C ++ - on-Windows专家,并愿意或多或少地建立你自己的构建系统[3]

[3]所有这一切主要是由于R无法使用VS工具链构建。并且美元知道人们已经尝试过。这里的责任在于操作系统/编译器供应商,因为它没有遵循标准,这些标准使R Core团队能够在Windows(通过gcc),OS X以及基本上所有Unix版本(包括所有Linux变体)上提供一致的产品。


0
投票

我尝试在Visual Studio上编译rcpp,并且达到了5个链接错误,例如

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

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

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

我做了一个区分大小写的替换OUT -> RCPP_TYPE_OUTClass -> RCPP_TYPE_Class

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

#define _CRT_SECURE_NO_WARNINGS
#define __INTEL_COMPILER 

我也忽略了警告4996,并在一个文件中将size_t输入int

在包括rcpp.h之前,我使用#undef作为宏ERROR,min和max。

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