在 Raku 中通过 NativeCall 调用 GSL 函数会抛出错误

Calling GSL functions via NativeCall in Raku throws error

问题

我正在尝试从 raku 呼叫 cumulative distribution function of chisq function in GSL

这是我的 raku 脚本 chisq.raku

#Calling gsl_cdf_chisq-P function in GSL from raku

use NativeCall;

sub gsl_cdf_chisq_P(num64, num64) returns num64 is native('gsl') { * };
sub gsl_cdf_chisq_Q(num64, num64) returns num64 is native('gsl') { * };


sub pchisq($q, $df, $lower-tail = True) {
  my $a = $q.Num;
  my $b = $df.Num;
  if $lower-tail == True {
    return gsl_cdf_chisq_P($a, $b)
  } else {
    return gsl_cdf_chisq_Q($a, $b)
  }
  }

say pchisq(3,4);

执行此脚本时,出现以下错误:

Cannot locate native library '(null)': /usr/lib/x86_64-linux-gnu/libgsl.so: undefined symbol: cblas_ctrmv
  in method setup at /usr/share/perl6/core/sources/947BDAB9F96E0E5FCCB383124F923A6BF6F8D76B (NativeCall) line 286
  in block gsl_cdf_chisq_P at /usr/share/perl6/core/sources/947BDAB9F96E0E5FCCB383124F923A6BF6F8D76B (NativeCall) line 578
  in sub pchisq at chisq.raku line 13
  in block <unit> at chisq.raku line 19

通过阅读 NativeCall 上的文档,我包含了共享库 libgsl.so

谷歌搜索显示 cblas_ctrmv 可能(不确定)与 lapack 有关。

所以我搜索了 liblapack.so,它确实存在于 /usr/lib 中。 echo $LD_LIBRARY_PATH显示

/usr/local/lib/R/lib::/lib:/usr/local/lib:/usr/lib/x86_64-linux-gnu:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server

为了看看我是否可以修复它,我使用命令 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/usr/lib 添加到 LD_LIBRARY_PATH 并再次尝试 运行 脚本。

仍然无法正常工作,同样的错误消息。

环境:

我是运行宁码在docker container inside rstudio.

Raku 版本 2019.11

它有 gsl-dev 个文件和 gsl 个库。 容器在 /usr/lib/x86_64-linux-gnu/ 内有共享库 libgsl.so。 此文件夹内的其他共享库是

有没有办法让它工作?

我确认 Ubuntu 18.04 附带的 libgsl 和 libgslcblas 版本会产生您发现的那种错误。 我安装了两个库的 Debian Buster 版本(即使这不是好的做法)并且奇迹般地解决了问题。

看起来 rocker/rstudio 的基本图像已更新为 debian:buster

安装libgsl23后问题解决

现在有效了!!