2016-10-25 7 views
-2

패키지를 CRAN 저장소에 제출했습니다. 패키지가 오류없이 수락되었지만 CRAN 유지자를 확인하는 두 번째 단계에서 다음 오류가보고되었습니다.C++ R 패키지 오류 : 라이브러리 업로드

불행히도 나는 그것을 고칠 수있는 방법을 모르겠다. 내 C++ 파일에서

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 *, ...); 
     ^

, 내가 쓴 :

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

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

어떻게이 문제를 해결해야합니까? Rpp.h를 포함 시켰습니까?

+2

제목이 가장 유익하지 않습니다. 거의 모든 (?) CRAN 패키지 작성자가 Brian Ripley의 이메일을 받았습니다. – csgillespie

+1

제목도 마찬가지입니다. 제목도 있습니다. 질문 내용에 아무런 영향이 없습니다. 실제 오류 메시지 또는 문제의 변형을 사용하여 다시 말하십시오. –

답변

8

R 자체는 1990 년대 초에 초기 시작 방식으로 C로 작성되었습니다. C에는 네임 스페이스가 없으므로 네임 스페이스 분리가 없어 충돌이 발생할 수 있습니다. 동일한 이름을 가진 다른 라이브러리의 식별자는 오인 될 수 있습니다. 이것은 여기에서 일어났다.

R은 C API에서 length(), error() 등의 기능을 사용하며 이름이 공통 인 방식으로 충돌 할 가능성이 높습니다. 따라서 R은 기호에 Rf_을 붙이는 메커니즘을 가지고 있습니다. errorRf_error이됩니다. 이것은 전처리기를 사용하는데, 이는 컴파일러 자체를 사용하는 것과는 대조적으로 합리적으로 멍청하다. 그래서 R이 error을 볼 때 Rf_error이되기를 원합니다. 여기에 어떻게됩니까

은 매우 가능성이 #include <RcppArmadillo.h>있다 (그리고 따라서는 실제 라이브러리 포함 전에 암시 #include <Rcpp.h>가. 주위에 그것을 다른 방법을 시도한다는 것이다. error() 라이브러리 방해하지 않습니다 그와 그 방법의 R의 메싱

+0

수정을 제안했지만 내가하지 않은 부분을 추가했습니다. 방법을 알다 –