Ruby 解析器的性能一般,在一些对性能要求很高的场合我们必须用C语言来编写,然后使用Ruby去调用C库。但是,Ruby调用C库并不是一件轻松的事,需要你对Ruby的内部数据结构有比较深入的了解,甚至需要你仔细阅读Ruby相关的源代码,然后用C语言编程作为黏合剂,用Ruby特有的C API去给外部的C库增加一层封装。
对程序员的要求很高。而且一旦Ruby内部的数据结构随着版本升级发生变动,你的这些程序就必须重写。比方说现在Ruby 1.9出来以后,绝大部分Ruby的C扩展库统统无法正常编译。所以给Ruby写C的扩展库一件非常痛苦的事情,而且也是Ruby社区程序员一直抱怨的问题之一。然而随着FFI的出现,我们即将告别这些痛苦的历史!
FFI即Foreign Function Interface,外部函数调用接口,并非Ruby独有的概念,只不过因为Ruby扩展库带来的痛苦,使得Ruby的FFI显得格外迫切。FFI最早已 经在 Rubinius 虚拟机平台上实现了,随后在JRuby上面也得以实现,而今天:2008年11月1日,在Ruby官方版本的解析器Ruby 1.8.6/1.8.7和1.9版本上也可以使用FFI了。
安装 FFI 的方法: gem install ffi
使用FFI也很简单,比方说调用C语言标准库的printf函数,我们可以这样来写:
require 'ffi'
module MyExtModule
extend FFI::Library
attach_function :printf, [:string], :void
end
MyExtModule.printf("Hello Ruby FFI\n")
用attach_fuction就可以把C语言标准库的printf函数绑定到ruby里面来了,后面的参数分别声明C函数的传入参数和返回值。如果需要 引入其他C库,可以预先使用ffi_lib指定库的名称。(我使用ffi_lib未能绑定非标准库,有可能是FFI的bug?也有可能是我没有设置对?)
有了FFI,在Ruby语言里面调用C库,就变成了一件异常轻松的事情,完全不需要ruby程序员再去学习C语言了,只要你手里捧着C库的 API手册能看清楚函数的参数定义就够用了,然后你就可以直接在ruby里面随心所欲的调用它了,在调用之前,只需要用attach_function进 行一次函数绑定声明即可。
Ruby FFI - Ruby调用C库最棒的工具 2008-11-02 00:40 by 见习编辑 robbin 评论(6) 有4162人浏览 Ruby C++ C C# 声明:ITeye资讯文章的版权属于ITeye网站所有,严禁任何网站转载本文,否则必将追究法律责任! < > 猎头职位: 北京: ITeye网站诚聘产品交互设计 Ruby解析器的性能一向被人垢病,很多性能敏感的程序,
最近做一个项目,用的rails框架,使用ruby语言,个人感觉不是很好用,且框架和语言自身问题不少。 今天遇到一个特诡异的问题,之前代码中使用了win32api.new来调用一个外部的dll来实现一些图形操作,之前一直都可以正常运行,但今天一运行到这里就出了一个unknown error,追查发现就是win32api.new出现了错误,这里可以保证该new方法指定的dll路径和方法名以及参数设
问题内容 /Library/Ruby/Site/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require': dlopen(/Library/Ruby/Gems/2.6.0/gems/ffi-1.15.4/lib/ffi_c.bundle, 9): no suitable image found. Did find: (LoadError)
出现场景 最近公司换了M1的macbookpro,安装完IOS环境后,在项目中运行pod install出现以后错误 mymacbook$ pod install LoadError - dlopen(/Library/Ruby/Gems/2.6.0/gems/ffi-1.15.1/lib/ffi_c.bundle, 0x0009): tried: '/Library/Ruby/Gems/2.6
Mac终端运行CocoaPod命令时报错: /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ ruby/2.6.0/rubygems/dependency.rb:311:in `to_specs': Could not find 'ffi' (>= 1.3.0) among 81 total gem(s) (G
ruby监控目录变化 安转gem插件 #gem install ffi 监控代码 require 'rubygems' require 'ffi' module Inotify extend FFI::Library ffi_lib FFI::Library::LIBC class Event < FFI::Struct layout \ :wd, :int,
Building native extensions. This could take a while... ERROR: Error installing cocoapods: ERROR: Failed to build gem native extension. current directory: /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.
想直接看解决方案,可以翻到最后 首先安装cocoapods sudo gem install cocoapods -v 1.9.3 在M1芯片的Mac电脑上,执行完上述命令后,在使用pod命令时(比如pod install),会报ffi相关的错误,如下: missing compatible arch in /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/li
最近做了一个脚本。 后来又用 java 做了个界面。想用 java 调用脚本。 直接使用 ruby 脚本没有问题,再用 java 调用 ruby 脚本之后就出现问题了。 现在出现的问题是: 1.有好几个 ruby 文件。 java 调用其中一个文件 a.rb 后, a.rb 中 require 的 b.rb 就查找不到路径了,即时再同一个目录下 2.比如调用了本地的 pod , a.rb 中有 r
在M1芯片的Macbook安装Ruby会遇到很多问题。 比如,用ruby-install会失败,rbenv install 2.7.2也会失败。 我结合网上的一些方法把成功的流程梳理一下,供参考。 第一步:安装gpg brew install gpg 第二部:配置key gpg --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF
执行pod install时报错 Ignoring ffi-1.12.2 because its extensions are not built. Try: gem pristine ffi --version 1.12.2 提示执行 gem pristine ffi --version 1.12.2 执行之后又会报错 ERROR: While executing gem ... (Gem: