我正在尝试使用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 创建一个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 gem,它需要一些C扩展。一旦编译完成,就通过Ruby FFI将其绑定到gem中。
我的设置:我将bundle用于宝石支架。在我的gems文件夹中,有一个子文件夹ext
。这包括一个静态Makefile,另一个子文件夹source
和一个extconf.rb。
该source
文件夹包含所有.c和.h文件。
Makefile不必动态创建。如果我呼吁make clean && make
在ext
一切编译,以及宝石的作品如预期。
现在,我给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
并尝试将其安装在另一台计算机上时,该扩展名未编译。
谁能告诉我,为了让扩展在安装时自动编译,我该怎么做?