在Raku中通过NativeCall调用GSL函数会引发错误

时间:2019-12-11 17:21:19

标签: docker lapack gsl raku nativecall

问题

我正在尝试从Raku致电cumulative distribution function of chisq function中的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

Google搜索显示cblas_ctrmv可能(不确定)与lapack相关。

因此,我搜索了liblapack.so中确实存在的/usr/libecho $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

要查看是否可以解决该问题,我使用命令/usr/libLD_LIBRARY_PATH添加了export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib并尝试再次运行该脚本。

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

环境:

我正在docker container inside rstudio中运行代码。

Raku版本2019.11

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

有办法使它正常工作吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

好像rocker/rstudio的基本图像已更新为debian:buster

安装libgsl23后,问题已解决。

现在可以使用!!