Вызов функций GSL через NativeCall в Raku вызывает ошибку

Проблема

Я пытаюсь вызвать кумулятивную функцию распределения функции chisq в GSL от raku.

Это мой сценарий 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, возможно (не уверен) был связан с .

Итак, я поискал 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

Чтобы посмотреть, смогу ли я это исправить, я добавил /usr/lib к LD_LIBRARY_PATH с помощью команды export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib и снова попытался запустить сценарий.

По-прежнему не работает, такое же сообщение об ошибке.

Среда:

Я запускаю код в контейнере докеров внутри rstudio.

Версия Raku 2019.11

В нем есть gsl-dev файлов и gsl библиотека. Контейнер имеет общую библиотеку libgsl.so внутри /usr/lib/x86_64-linux-gnu/. Другие общие библиотеки в этой папке:  введите описание изображения здесь

Есть ли способ заставить его работать?


person Suman Khanal    schedule 11.12.2019    source источник
comment
Если я правильно понимаю, это общая библиотека, которая вызывается из другой общей библиотеки, это правильно? Я подозреваю, что вторая общая библиотека не загружена. Что я бы сделал, так это объявил cblas_ctrmv с соответствующей библиотекой в ​​скрипте, чтобы его библиотека была зарегистрирована и, таким образом, ее можно было вызвать.   -  person jjmerelo    schedule 11.12.2019
comment
Также обратите внимание, что, я полагаю, Фернандо Сантагата работает над модулем GSL.   -  person Elizabeth Mattijsen    schedule 11.12.2019
comment
Я протестировал код на Ubuntu 19.10, и он сразу заработал (я уже установил библиотеку gsl). Результат был: 0,4421745996289249.   -  person Håkon Hægland    schedule 11.12.2019
comment
Возможно, связано: stackoverflow .com / questions / 49036300 / См. также запрос на улучшение rakudo: github.com/rakudo / rakudo / issues / 1584   -  person Curt Tilmes    schedule 12.12.2019
comment
Да, я работаю над модулем интерфейса libgsl. На данный момент преобразована 561 функция.   -  person Fernando Santagata    schedule 16.12.2019


Ответы (2)


Я проверил, что версии libgsl и libgslcblas, поставляемые с Ubuntu 18.04, вызывают ошибку, которую вы обнаружили. Я установил версию обеих библиотек для Debian Buster (даже если это не очень хорошая практика), и это чудесным образом устранило проблему.

person Fernando Santagata    schedule 21.12.2019

Похоже, базовое изображение rocker/rstudio обновлено до debian:buster.

После установки libgsl23 проблема решена.

Теперь работает !!

person Suman Khanal    schedule 28.12.2019