标签: ruby-ffi

在struct中由指针引用的ruby ffi调用函数?

我正在尝试使用libfluidsynth和ruby ffi,需要迭代声音来获取所有乐器.具体来说,_fluid_sfont_t结构具有我需要调用的iteration_start和iteration_next引用:

http://fluidsynth.sourceforge.net/api/struct__fluid__sfont__t.html

void (*iteration_start)(fluid_sfont_t* sfont);
Run Code Online (Sandbox Code Playgroud)

我在ffi/ffi文档中看到如何引用结构的成员,其中这些成员是普通类型,我看到如何在C中设置回调以指向ruby Procs.但是我需要调用一个结构上的函数指针引用的函数.

如何才能做到这一点?

ruby ffi ruby-ffi

5
推荐指数
0
解决办法
457
查看次数

如何使用 Ruby fiddle 加载 Windows DLL 文件?

我正在尝试为 ruby​​ 创建一个GR 框架绑定。我用小提琴。Fiddle 是使用 ruby​​ 转换外部函数接口 (FFI) 的默认扩展。它在 Linux 和 Mac 上运行良好。但在 Windows 上,我收到以下错误。

代码hoge.rb

require 'fiddle/import'

module M
   extend extend Fiddle::Importer
   dlload File.expand_path('gr/bin/libGR.dll').gsub("/", "\\")
end
Run Code Online (Sandbox Code Playgroud)

错误

Traceback (most recent call last):
        7: from hoge.rb:3:in `<main>'
        6: from hoge.rb:5:in `<module:M>'
        5: from C:/Ruby26-x64/lib/ruby/2.6.0/fiddle/import.rb:77:in `dlload'
        4: from C:/Ruby26-x64/lib/ruby/2.6.0/fiddle/import.rb:77:in `collect'
        3: from C:/Ruby26-x64/lib/ruby/2.6.0/fiddle/import.rb:87:in `block in dlload'
        2: from C:/Ruby26-x64/lib/ruby/2.6.0/fiddle.rb:47:in `dlopen'
        1: from C:/Ruby26-x64/lib/ruby/2.6.0/fiddle.rb:47:in `new'
C:/Ruby26-x64/lib/ruby/2.6.0/fiddle.rb:47:in `initialize': No such file or directory (Fiddle::DLError)
        5: from hoge.rb:3:in `<main>'
        4: from hoge.rb:5:in …
Run Code Online (Sandbox Code Playgroud)

ruby windows dll ruby-ffi fiddle

5
推荐指数
1
解决办法
1505
查看次数

为什么gem无法自动编译我的C扩展名

我构建了一个Ruby gem,它需要一些C扩展。一旦编译完成,就通过Ruby FFI将其绑定到gem中。

我的设置:我将bundle用于宝石支架。在我的gems文件夹中,有一个子文件夹ext。这包括一个静态Makefile,另一个子文件夹source和一个extconf.rb。

source文件夹包含所有.c和.h文件。

Makefile不必动态创建。如果我呼吁make clean && makeext一切编译,以及宝石的作品如预期。

现在,我给extconf.rb提供以下内容:

require 'mkmf'
require 'fileutils'

# Give it a name
extension_name = 'somename'

# The destination
dir_config extension_name

# Do the work
create_makefile extension_name

# Overwrite Makefile
FileUtils.cp 'Makefile.template', 'Makefile'
Run Code Online (Sandbox Code Playgroud)

所以我让mkmf首先创建一个Makefile,然后再用我的静态模板覆盖它。笨。

当我现在通过构建我的gem rake build并尝试将其安装在另一台计算机上时,该扩展名未编译。

谁能告诉我,为了让扩展在安装时自动编译,我该怎么做?

ruby rubygems makefile ruby-c-extension ruby-ffi

2
推荐指数
1
解决办法
318
查看次数

标签 统计

ruby ×3

ruby-ffi ×3

dll ×1

ffi ×1

fiddle ×1

makefile ×1

ruby-c-extension ×1

rubygems ×1

windows ×1