Ошибка при открытии разделяемой библиотеки C++ в качестве драйвера порта Erlang

Я использую Ubuntu 18:04 и у меня есть общая библиотека C++, с которой я хочу работать на динамическом языке.

Общая библиотека доступна здесь -

http://www.warmplace.ru/soft/sunvox/sunvox_lib-1.9.4c.zip

Это небольшой встроенный синтезатор - распаковав zipfile, который я использую sunvox_lib/linux/lib_x86/sunvox.so и изменение разрешений через chmod 755,

Он отлично работает с Python 3.6 через ctypesтак что я не думаю, что это испорчено -

(sv_demo) justin@justin-XPS-13-9360:~/work/sv_demo$ python
Python 3.6.8 (default, Dec 24 2018, 19:24:27) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import cdll
>>> sv.sv_init(0, 44100, 2, 0) 
Desired audio buffer size: 2048 frames
ALSA: pulse
ALSA HW Default rate: 44100
ALSA HW Rate: 44100 frames
ALSA HW Buffer size: 4096 frames
ALSA HW Period size: 227
ALSA HW Periods: 0
ALSA SW Avail min: 227
ALSA SW Start threshold: 1   
ALSA SW Stop threshold: 4096
67844
>>> sv.sv_deinit()
SOUND: sundog_sound_deinit() begin
SOUND: sundog_sound_deinit() end
Max memory used: 41823
0
>>> exit()
(sv_demo) justin@justin-XPS-13-9360:~/work/sv_demo$ 

Однако я действительно хочу / должен использовать Erlang для этого, а не Python; и надеялся сделать это через механизм драйвера порта. Но -

(sv_demo) justin@justin-XPS-13-9360:~/work/sv_demo$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]    
Eshell V9.3  (abort with ^G)
1> erl_ddll:load_driver(".", "sunvox.so").
{error,{open_error,-10}}

Что может {open_error, -10} имею в виду? Я работал с драйверами портов раньше и не было этой проблемы. Я немного погуглил, но не могу найти причину, по которой Python рад работать с ним, а Эрланг - нет.

Какие-нибудь мысли?

ТИА


Обновить.

2> erl_ddll:format_error({open_error, -10}).
"cannot open shared object file: No such file or directory"

Почему это не может найти sunvox.so? Он сидит там в корневом каталоге, из которого я запускаю erl...

3 ответа

Я думаю, что я вызываю общий объект с неправильной ручкой - вам нужно отбросить .so суффикс -

Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V9.3  (abort with ^G)
1> erl_ddll:load_driver(".", "sunvox").   
{error,no_driver_init}
2> erl_ddll:format_error(no_driver_init).         
"No driver init in dynamic library"
3> 

Вернуться к доске для рисования:-(

Из документации erl_dll,erl_dll:load_driver- загрузить связанный драйвер. Связанные драйверы - это библиотеки, построенные с определенным набором интерфейсов... которые, я думаю, общая библиотека не реализовала бы.

Один из вариантов - создать NIF с использованием общей библиотеки и вызвать NIF из erlang. NIF просто нужно обернуть функции, которые вы хотите использовать, из общей библиотеки.

Попробуй

      erl_ddll:load_driver(".", "sunvox").
  • без расширения '.so'.
Другие вопросы по тегам