C ++ R包错误:上传库

时间:2016-10-25 09:50:04

标签: r package rcpp armadillo

我将我的包提交到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?

1 个答案:

答案 0 :(得分:8)

R本身是用C编写的,因为它早在20世纪90年代初就开始了。 C没有名称空间 - 由于缺少名称空间分隔,这可能导致冲突。来自共享相同名称的不同库的标识符可能是错误的。这发生在这里。

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

这里发生的事情是你很可能#include <RcppArmadillo.h>(因此隐含#include <Rcpp.h> 之前你的实际图书馆的包含。反过来尝试一下。方式R弄乱它的error()不会干扰那个令你困惑的图书馆。