c - 在 Mac OS X 上将 GNU 科学库链接到 R

标签 c r shared-libraries static-libraries gsl

我已经在我用 C 编写的程序上工作了一段时间,该程序使用 GSL 中的函数运行 MCMC。我已经阅读了很多 GNU 文档和编写 R 扩展,并且我已经阅读了很多关于使用 RcppGSL 的内容,但在我看来,用 C 编写然后将函数动态加载到 R 中更容易。我已经看到许多资源描述了如何在 Windows 上构建该功能,但我所看到的关于如何在基于 Unix 的系统上使用它的一切都是“相对简单”和“简单”,但我无法让它工作。

我渴望有人开始工作的 C 脚本是一个简单的脚本。它只是简单地获取一个具有给定行数和列数的数组,将其转换为 gsl_matrix,然后将其转换回数组(这基本上就是我的程序所做的,除了整个改变条目是什么)。 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)
}

我所做的是确保我的终端 (Mac OS X) 和 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/

相关文章:

c - 共享库构造函数不工作

windows - 从架构上讲,共享对象 (SO) 和动态链接库 (DLL) 之间有什么区别?

linux - undefined symbol ,即使有显式链接

r - 根据其他时间序列列的超前或滞后创建多个列

r - 如何使用 R 通过 FTP 推送 .csv 文件?

r - 在 R 的 JAGS 或 BUGS 中指定离散威 bool 分布

c - 哪个更好, ch = '\n' ;写(1,&ch,1);或 putchar ('\n' );?

c - C语言读取文件

c - 使用c中的函数的高级科学计算器

c - 基本整数赋值