我在一个用C编写的程序上工作了一段时间,这个程序使用GSL中的函数运行MCMC。我读过很多GNU文档和编写R扩展,也读过很多关于使用RcppGSL的内容,但在我看来,用C编写然后将函数动态加载到R中似乎更容易些。我看到了许多描述如何在Windows上构建函数的源代码,但我看到的关于如何在基于Unix的系统上使用它的所有内容都是“相对直截了当”和“简单”,但我不能让它工作。
我渴望有人来工作的C脚本是一个简单的脚本。简单地说,取一个具有给定行数和列数的数组,将其转换成一个gsl_矩阵,然后将其转换回一个数组(这基本上就是我的程序所做的,除了更改条目的全部内容之外)。C脚本是
#include <R.h>
#include <stdio.h>
#include <gsl/gsl_linalg.h>
void simple( int *n, int *rows, int *cols)
{
int r,c;
int Cols = *cols; //This step, and the step below it are unnecessary except for readability
int Rows = *rows;
gsl_matrix * m = gsl_matrix_alloc (Rows, Cols); // Declares a gsl_matrix m of size Rows x Cols
for( r = 0; r< Rows; r++)
for (c=0; c< Cols; c++)
gsl_matrix_set(m,r,c, *(n+sizeof(int)*(Cols*r+c))); // The array is organized by rows, sets matrix values
for( r=0; r< Rows; r++)
for (c=0; c < Cols; c++)
*(n+sizeof(int)*(Cols*r+c))=gsl_matrix_get(m,r,c); // This return matrix values to the array (should be the same as before)
}
我所做的是确保我的终端(MacOSX)和R共享simple.c保存到的同一目录。我编译了上面的类型
R CMD SHLIB simple.c
进入我的终端创建相应的simple.so文件,也保存到桌面。那么在R里我可以
dyn.load("simple.so")
这就是我收到错误的地方
Symbol not found: _gsl_matrix_alloc
Expected in: flat namespace
我对这个错误感到困惑,因为编译器似乎可以识别make文件
< gsl/gsl_linalg.h >
,所以我认为它不能识别函数的原因是R没有连接到库,但是我不知道如何解决这个问题。在这一点上,如果函数都是可识别的,那么我可以在R中执行函数
x=.C("simple", c(as.integer(c(1,4,7,2,5,8,3,6,9)),as.integer(3),as.integer(3)))
如果我的函数动态加载正确,它就可以工作了,我将返回X,这正是我作为.C的第二个输入所输入的内容
任何洞察都将非常有帮助,无论是否有人成功地将GSL库链接到Mac OS X上的R,都可以给我发消息或发表评论。我在帮助论坛上唯一能找到的就是它是“简单的”或者“相对简单的”,但是我不知道该怎么做!请帮忙!
最佳答案
您需要指定gsl函数的位置:
R CMD SHLIB simple.c -lgsl -lgslcblas
关于c - 在Mac OS X上将GNU科学库链接到R,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11554840/