Ruby 使用 Fiddle 调用 C 函数

Ruby 使用 Fiddle 调用 C 函数

写一个c函数

split.c

double split(double num)
{
  double ret = 0;
  ret = num / 2;
  return ret;
}

编译成动态库

 gcc -o libsplit.so -shared split.c

在 split.rb 里调用 libsplit.so 里的 split 函数

require 'fiddle'

# Open the file
libsplit = Fiddle.dlopen('./libsplit.so')

# Load the `split` function
split = Fiddle::Function.new(
    libsplit['split'],
    [Fiddle::TYPE_DOUBLE], 
    Fiddle::TYPE_DOUBLE
)

# Call the `split` function
puts split.call(10) # => 5 
  • Fiddle.dlopen,与c中调用动态链接库方法名相同dlopen

  • Fiddle::Function.new 参数为 函数名,参数,返回值

还可以通过 Fiddle::Importer mixin提供的DSL

module Test
  extend Fiddle::Importer
  dlload './libsplit.so'
  extern 'double split(double)'
end

puts Test.split(10) # => 5 

links

  • RubyLetter - Shared Libraries: How Ruby and C Work Together

  • ffi/ffi: Ruby FFI

  • (5) 使用 Fiddle 调用 C 函数 · Ruby China

  • (5) 使用 ruby::fiddle 封装动态链接库 · Ruby China

  • Module: Fiddle (Ruby 2.0.0)

你可能感兴趣的:(ruby)