2013-04-18 2 views
0

C에서 gibbs 함수를 작성 중이며 rnorm()과 같은 임의의 숫자 함수를 사용하려고합니다.아키텍처에 대한 정의되지 않은 기호 x86_64 : getRNGstate() 및 putRNGstate()

내 코드는 다음과 같다 :

> Undefined symbols for architecture x86_64: "_GetRNGstate", 
> referenced from: 
>  _gibbs in main.o "_PutRNGstate", referenced from: 
>  _gibbs in main.o "_Rf_rchisq", referenced from: 
>  _gibbs in main.o "_Rf_rnorm", referenced from: 
>  _gibbs in main.o "_Rf_runif", referenced from: 
>  _gibbs in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see 
> invocation) 

내가 엑스 코드를 사용하고 있는데 나는 모두가 알고 :

#include <stdio.h> 
#include <string.h> 
#include <R.h> 
#include <Rmath.h> 
void foo(int *nin, double *x) 
{ 
    int n = nin[0]; 

    int i; 
    GetRNGstate(); 

    for (i=0; i<n; i++) 
    { 
     x[i] = rchisq(2); 
     Rprintf("%f\n",x[i]); 
    } 
    // exit R random-gen routine 
    PutRNGstate(); 
} 

그러나 내가 Xcode를 구축하려고 할 때 오류 메시지는 R 및 R64bit. 터미널 $ R은 R64bit를 실행하고 Aquamacs도 R64bit를 실행합니다. 서로 다른 버전에서 충돌인지 여부를 알지 못합니다. 그렇다면 Xcode에서 R을 올바르게 참조하도록 어떻게 설득 할 수 있습니까?

Btw R.h 및 rmath.h 파일이 적어도 3 곳에 있음을 발견했습니다! Xcode에서 어떤 경로를 재배치해야할지 모르겠습니다! 현재 제 3의 헤더 경로와 동일한 헤더 경로가 추가됩니다. 그리고 모든 #include는 잘 동작합니다.

R.Frameworks/Headers 
R.Frameworks/Versions/2.15/Resources/include 
R.Frameworks/Versions/Current/Resources/include 

그러나 어느 쪽이든, 어떤 rnorm을받지 않고 C 함수() - 같은 기능이 작동하며 R은 dyn.load를 통해 사용할 수 있습니다().

그래서 제발 도와주세요!

많이 감사!

+0

글쎄, 내가 말, R CMD SHLIB의 main.c를 다음 dyn.load()를 blar blar 사용하여 컴파일 터미널 사용 ... 그것은 작동! 왜 Xcode는 그 getRNGstate()를 알아낼 수 없습니까? – Lisa

+0

R CMD SHLIB를 호출 할 때 완전한 gcc 라인에주의를 기울이십시오. R은 링크 대상을 알고 있기 때문에 작동합니다. Xcode에 대한 전화가 단순히 불완전하다는 것을 두려워합니다. –

+0

Dirk 덕분에 Xcode를 다룰 때 Build 버튼을 클릭하기 만하면 실제로 어떤 컴파일러 Xcode가 호출되는지 알지 못합니다. R CMD SHLIB main.c에서 실제로 R이 컴파일러라고 할 수 있습니까? – Lisa

답변

0

컴파일러 출력 만 분석하면 해당 기능을 구현하는 코드 조각을 찾지 못하고 있습니다. 일반적으로 라이브러리에서 구현되며, 코드에서 링크해야하는 라이브러리 세트를 전달하지 못할 수도 있습니다.

내가 말하고 싶은 것은 당신이 컴파일하거나 스크립트 (당신이 GCC 컴파일러를 사용하고 있다고 가정) 그런 식으로 코드를 컴파일하고 있는지 확인해야한다는 것입니다 :

의 gcc -o 프로그램 main.o를 -llibrary1 -llibrary2 ... 그 라이브러리가 당신의 프레임 워크에서 제공

+0

답변 해 주셔서 감사합니다. 나는 도서관 경로가 잘되었다고 생각한다. 사촌 나는 R/.../ 경로를 포함하고 최소한 Rprintf() 작품을 추가했습니다. 그냥 getRNGstate() putRNGstata() 계속 실패 .. 그리고 나는 이유를 모르겠다. Btw 터미널에서 R CMD SHLIB를 사용하면 다시 작동합니다 .. Xcode 문제입니까? – Lisa

1

귀하의 질문은 불완전하고 재현되지 않습니다 (라이브러리가 libxxx.so 호출하면 그냥 기억, 당신은 -lxxx를 gcc를 위해 통과해야합니다) 실제 코드가 부족하기 때문입니다. 몇 가지 문제는 내가 제안 할 수 있습니다, ... 어쩌면 당신은 단지를 수정해야 PutRNGstate(), Rf_rchisq()

  1. 는 R. 당신이 일상적으로 사용하는 연결에 실패 모든 문자를 밑줄을 선도 문자가 있습니다 스위치를 실수로 설정 했습니까?

  2. 동적 확장 기능으로 R에로드 할 항목이 있는지 또는이 R 기능을 사용하여 독립 실행 형 프로그램을 작성할지 여부는 게시물에서 분명하지 않습니다. 둘 다 할 수 있습니다.

  3. 자체 작성 기능을 호출하는 것은 쉬운 일이 아닙니다. Rcpp에 기대어 cppFunction('double foo(int df) { return Rf_rchisq(df); }')을 반복적으로 호출하고 (RNGScope 클래스를 통해 Rcpp에서 RNG 상태를 처리하기 때문에) 을 반복적으로 호출 할 수 있습니다.

  4. 독립형이 필요한 경우 Writing R Extensions 설명서 및 Rmathlib 라이브러리를 참조하십시오. 전에 작은 예제를 게시했습니다.

+0

답변 해 주셔서 대단히 감사드립니다. 방금 원본 코드를 표시하기 위해 내 게시물을 편집했습니다. 그래서 R을 위해 루프를 작성해야하고 apply()를 사용할 수 없다는 동기가 있으므로 C 부분으로 이동하여 속도를 높이고 싶습니다. 하지만 루프 내부에서 이미 R 기능 (예 : RNG, 적용() 등)이 많이 사용되어 RNG가 작동하는지 확인해야합니다. 사실 나중에 apply()가 C에서 작동하는지 알아볼 것입니다. 그렇지 않으면 모든 apply()를 for 루프로 다시 변환해야 할 수도 있습니다 ... – Lisa

+0

cppFunction()에 익숙하지 않습니다. c/cpp에서 RNGstate() 함수를 제거 할 수 있지만 단순히 rchisq()를 작성한다는 의미입니까? 그런 다음 R의 cppFunction에서 호출합니다. – Lisa

+0

요컨대, 그렇습니다. 그리고'rchisq()'도 벡터화되어 있으므로 한 번의 호출로'N'을 얻을 수 있습니다. 그러나 Rcpp 문서를 읽거나 예를 들어보십시오 (예 : http://gallery.rcpp.org). –

관련 문제