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

最近的文章

某段ruby元编程

可以用irb(Ruby的REPL程序)实际运行:class A [:scope, :show_snippets, :search_results, :search_objects].each do |name| define_method name do search instance_variable_get "@#{name}" end end def search return if @searched @scope, @show_s...…

继续阅读
更早的文章

caddy ace

看了10天的golang, 写了一些东西,参考tj的n写了gvm环境版本控制,不过是用shell写的。今天在migrate模版引擎的时候, 之前是用martini+ ace 写的站点。偶然看到了一个封装很规范的go服务器caddy, 所以想要migrate,顺手试了一下给caddy写扩展,项目caddy-acecaddy为扩展提供了RegisterPlugin方法,一般在插件包的init函数中调用,使用方法如下:caddy.RegisterPlugin("basicauth", caddy...…

继续阅读