2014-11-29 5 views
2

R에서는 Ziggurat 샘플러를 사용하려고하지만 실제로는 C++ 코드에서 직접 사용하려고합니다. GSL 라이브러리 인 RcppGSL과 RcppZiggurat를 설치하고 R에서 zrnorm()을 사용하면 문제가 없습니다. 나는 RcppZiggurat.pdf에서 제공되는 코드 샘플을 컴파일하고, C++ 코드에서 Ziggurat sampler를 직접 구현하려고 시도한다고 생각했지만 ... 다음은 발생하지만 ...RcppZiggurat 예제 코드를 컴파일 할 수 없습니다.

pdf 파일 나는 간단하게 활용할 수있는 생각 :

#include <Rcpp.h> 
    #include <Ziggurat.h> 
    static Ziggurat::Ziggurat::Ziggurat zigg; 
    // [[Rcpp::export]] 
    Rcpp::NumericVector zrnorm(int n) { 
    Rcpp::NumericVector x(n); 
    for (int i=0; i<n; i++) { 
    x[i] = zigg.norm(); 
    } 
    return x; 
    } 
    // [[Rcpp::export]] 
    void zsetseed(unsigned long int s) { 
    zigg.setSeed(s); 
    return; 
    } 

오류 : 내가 어떻게 여기에서 진행하는 전혀 단서가 없다

official_zigg_code.cpp:2:10: fatal error: 'Ziggurat.h' file not found 
#include <Ziggurat.h> 
    ^
1 error generated. 
make: *** [official_zigg_code.o] Error 1 


clang++ -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -  
    I/usr/local/include/freetype2 -I/opt/X11/include - 
    I"/Library/Frameworks/R.framework/Versions/3.1/Resources/library/Rcpp/include" -fPIC -Wall - 
    mtune=core2 -g -O2 -c official_zigg_code.cpp -o official_zigg_code.o 
    Error in Rcpp::sourceCpp("official_zigg_code.cpp") : 
    Error 1 occurred building shared library. 

. 필자는 스택 교환에 대한 답을 찾기 위해 필사적으로 노력했지만 아무 것도이 문제를 해결하는 데 도움이되지 않습니다. 내가 RcppZiggurat 패키지가 실제로 위의 함수를 사용한다는 것을 이해하면 zrnorm()을 직접 사용할 수있을 때 어떻게 컴파일 할 수 있습니까?

답변

2

오류는 매우 분명하다 :

fatal error: 'Ziggurat.h' file not found 

이것은 당신이 R/RcppZiggurat에 대한 컴파일러에게하지 않았다는 것을 의미한다.

수정이 쉽습니다. sourceCpp()를 통해 Rcpp 중심의 컴파일의 경우, 이 한 줄 단지를 수행

// [[Rcpp::depends(RcppZiggurat)]] 

를 추가합니다. 이 모든 것은 Rcpp로 문서화되었으며, 여러분은 문서의 적어도 일부를 읽을 것으로 예상됩니다.

Rcpp 외부에서 빌드하려면 컴파일러에서 헤더 파일을 찾도록해야합니다. 하나는 보통 -I 플래그를 사용하는데, 이는 일반적으로 컴파일러가 도입되는 곳에서 논의됩니다.

+0

대단히 감사합니다. 이제 작동합니다. 처음 프로그래머로서 때로는 꽤 압도적 인 일이 될 수 있지만, 상당히 명확 할 것으로 기대하고있었습니다. 확실히 문서를 더 깊이 파헤 치려고합니다. – Affaeng

관련 문제