我在C中編寫gibbs函數,並希望使用隨機數函數,如rnorm()。架構x86_64的未定義符號:getRNGstate()和putRNGstate()
我的代碼是這樣的:
#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打造,該錯誤信息是:
> 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)
我使用Xcode和我知道,我都R和R64bit。在終端$ R運行R64bit和我的Aquamacs也運行R64bit。我不知道它是否是不同版本的碰撞,如果是這樣,我如何說服Xcode正確地引用R?
順便說一句我發現R.h和rmath.h文件至少有3個地方!我不知道我應該在Xcode中重新定位哪條路徑! 目前我正在添加與第三個相同的標題路徑。所有#include都可以正常工作。
R.Frameworks/Headers
R.Frameworks/Versions/2.15/Resources/include
R.Frameworks/Versions/Current/Resources/include
等
但無論哪種方式,沒有得到任何RNORM C函數() - 像功能會有效和R可以通過dyn.load使用它()。
所以請幫助!
非常感謝!
那麼,我用終端編譯,比如R CMD SHLIB main.c,然後使用dyn.load()blar blar ...它的工作原理! wtf ...爲什麼Xcode無法弄清楚那些getRNGstate()? – Lisa
當您調用R CMD SHLIB時,請密切關注完整的gcc行 - 因爲R知道要鏈接的內容,它可以工作。我擔心你對Xcode的調用不完整。 –
謝謝Dirk,當我處理Xcode時,我只點擊Build按鈕,所以我實際上不知道Xcode調用哪個編譯器。我可以在R CMD中說SHLIB main.c實際上R是編譯器嗎? – Lisa