0

我正在用 C 编写一个 gibbs 函数,并想使用随机数函数,例如 rnorm()。

我的代码是这样的:

#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?

顺便说一句,我发现 Rh 和 rmath.h 文件至少在 3 个地方!我不知道我应该在 Xcode 中重新定位哪条路径!目前我正在添加与第三个相同的标题路径。所有#include 工作正常。

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

ETC

但无论哪种方式,一个没有任何 rnorm() 类函数的 C 函数都可以工作,R 可以通过 dyn.load() 使用它。

所以请帮忙!

非常感激!

4

2 回答 2

1

由于缺少实际代码,您的问题不完整且不可重现。有几个问题我可以建议:

  1. R中有带前导下划线的符号。您无法链接的所有符号通常用作PutRNGstate(), Rf_rchisq(), ... 也许您只需要修复您不小心设置的开关?

  2. 从您的帖子中不清楚您是否希望将某些内容作为动态扩展加载到 R 中,或者您是否想使用这些 R 函数编写独立程序。你可以两者都做。

  3. 调用自己编写的函数可能很简单。通过依赖 Rcpp,我们甚至可以 重复cppFunction('double foo(int df) { return Rf_rchisq(df); }')调用foo(3) (因为 Rcpp 通过它的RNGScope类为我们处理 RNG 状态)。

  4. 如果您想要独立的东西,请查看编写 R 扩展手册和 Rmathlib 库。我之前发布过一些小例子。

于 2013-04-18T17:44:04.363 回答
0

仅分析编译器输出,它无法找到实现这些功能的代码。通常它们是在库中实现的,也许您没有将代码必须链接到的库集传递给它。

我想说的是,您必须编译或验证您的脚本是否正在使用类似的东西编译您的代码(假设您使用的是 gcc 编译器):

gcc -o 程序 main.o -llibrary1 -llibrary2 ...

这些库来自您的框架(请记住,如果您的库称为 libxxx.so 您必须传递给 gcc -lxxx )

于 2013-04-18T16:13:25.993 回答