首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将C++共享库作为Erlang端口驱动程序打开时出错

将C++共享库作为Erlang端口驱动程序打开时出错
EN

Stack Overflow用户
提问于 2019-01-25 18:38:49
回答 3查看 170关注 0票数 2

我使用的是Ubuntu 18:04,我想用动态语言使用这个C++共享库。

共享库可以从这里获得-

lib-1.9.4c.zip

这是一个小型嵌入式合成器-提取了我正在使用的sunvox_lib/linux/lib_x86/sunvox.so的via文件,并通过chmod 755更改了权限。

它可以通过ctypes使用Python3.6,所以我认为它没有损坏-

代码语言:javascript
代码运行次数:0
运行
复制
(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;并且希望通过端口驱动机制来这样做。但是.

代码语言:javascript
代码运行次数:0
运行
复制
(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为什么乐于使用它的原因,但Erlang不喜欢。

有什么想法吗?

提亚

更新。

代码语言:javascript
代码运行次数:0
运行
复制
2> erl_ddll:format_error({open_error, -10}).
"cannot open shared object file: No such file or directory"

为什么它找不到sunvox.so?它位于我运行erl的目录根目录中.

EN

回答 3

Stack Overflow用户

发布于 2019-01-25 20:39:59

我想我是用错误的句柄调用共享对象-您需要删除.so后缀-

代码语言:javascript
代码运行次数:0
运行
复制
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> 

回到画板:-(

票数 2
EN

Stack Overflow用户

发布于 2020-06-18 03:10:53

从文档动态链接库中,erl_dll:load_driver将加载一个链接到驱动程序中。使用一组特定的interfaces...which构建的链接驱动程序是库,我猜共享库不会实现。

一种选择是使用共享库创建NIF,并从erlang调用NIF。NIF只需要包装您想要从共享库中使用的函数

票数 2
EN

Stack Overflow用户

发布于 2022-11-10 10:15:28

试着

代码语言:javascript
代码运行次数:0
运行
复制
erl_ddll:load_driver(".", "sunvox").
  • 没有“.so”扩展。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54371108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档