问题是从Ruby访问G-WAN C API
所以我尝试使用FFI,但是gwan没有任何库,当我试图加载二进制文件时,它显示:
/home/asd/.gem/ruby/2.0.0/gems/ffi-1.9.0/lib/ffi/library.rb:123:in `block in ffi_lib': Could not open library '/home/asd/bin/gwan_linux32-bit/gwan': /home/asd/bin/gwan_linux32-bit/gwan: cannot dynamically load executable (LoadError)
from /home/asd/.gem/ruby/2.0.0/gems/ffi-1.9.0/lib/ffi/library.rb:90:in `map'
from /home/asd/.gem/ruby/2.0.0/gems/ffi-1.9.0/lib/ffi/library.rb:90:in `ffi_lib'
from /home/asd/bin/gwan_linux32-bit/127.0.0.1_8081/#127.0.0.1/csp/test.rb:26:in `<module:MyLibrary>'
from /home/asd/bin/gwan_linux32-bit/127.0.0.1_8081/#127.0.0.1/csp/test.rb:24:in `<main>'
因为,显然,它不是库,而是可执行二进制文件
起初我认为我应该为Ruby创建一个C扩展来访问G-WAN API,但是想到它,如果我们没有.o链接(仅提供.h),它也会失败,对?
所以..是否有可能使Ruby的FFI从.h加载而不是从dll加载?
答案 0 :(得分:0)
共享库中不提供G-WAN API:它由G-WAN可执行文件提供。
为了让Ruby受益于G-WAN API,这里无法替代集成Ruby运行时的G-WAN,就像它为C#,Java或Scala所做的那样。
尝试查找相关信息(有关如何从C调用Ruby和Ruby调用C的代码示例,以及如何在C和Ruby之间传递数据结构)并在gwan.ch向我们添加一行。
不要忘记检查这些资源是否是线程安全的,因为G-WAN是一个多线程应用程序。