【问题标题】:C++ R package error: uploading libraryC++ R包错误:上传库
【发布时间】:2016-10-31 18:47:46
【问题描述】:

我将我的包提交到 CRAN 存储库。该包被无误地接受,但在检查 CRAN 维护人员的第二步中报告了以下错误。

很遗憾,我不明白该如何解决。

In file included from /Builds/CRAN-QA-Simon/packages/mavericks-x86_64/Rlib/3.3/RcppArmadillo/include/armadillo:23:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/fstream:864:20: error: 
no member named 'Rf_error' in 'std::__1::codecvt_base'; did you mean simply 'Rf_error'?
    if (__r == codecvt_base::error)
               ^~~~~~~~~~~~~~

/Library/Frameworks/R.framework/Resources/include/R_ext/Error.h:35:12: note:
'Rf_error' declared here
void NORET Rf_error(const char *, ...);
           ^

在我的 C++ 文件中,我写道:

#include <math.h>      
#include "ANN/ANN.h"     
#include "NN.h"  
#include <R.h>   
#include "RcppArmadillo.h" 

#include <map>
#include <vector>
#include <iostream>

我该如何纠正这个问题?是否要包含 Rpp.h?

【问题讨论】:

  • 你的标题不是最有用的。几乎每个(?)CRAN 软件包作者都收到了来自 Brian Ripley 的电子邮件。
  • 我也正要指出这一点——标题也与问题内容无关。请使用实际错误消息或问题的一些变体重新措辞。

标签: r package rcpp armadillo


【解决方案1】:

R 本身是用 C 编写的,因为它早在 1990 年代初期就开始了。 C 没有命名空间——这可能会导致冲突,因为我们缺乏命名空间分离。来自共享相同名称的不同库的标识符可能会出错。这已经发生在这里。

R 在其 C API 中使用函数 length()error()、...等,考虑到名称的常见程度,这些函数可能会发生冲突。因此,R 具有将 Rf_ 添加到其符号的机制:error 变为 Rf_error。这使用了相当愚蠢的前身(而不是使用编译器本身)。因此,当 R 看到 error 时,它希望它是 Rf_error

这里发生的情况是您很可能有 #include &lt;RcppArmadillo.h&gt;(因此隐含的 #include &lt;Rcpp.h&gt; 之前包含在您的实际库中。换一种方式试试。这样 R 就搞砸了它的error() 不会干扰图书馆,这会让您感到困惑。

【讨论】:

  • 我添加了您建议修改的部分,但我不明白如何
猜你喜欢
  • 2020-12-17
  • 2023-03-23
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多