1

问题是从 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 加载?

4

1 回答 1

0

G-WAN API 不能从共享库中获得:它由 G-WAN 可执行文件提供。

要让 Ruby 从 G-WAN API 中受益,G-WAN 无法替代集成 Ruby 运行时,就像它为 C#、Java 或 Scala 所做的那样。

尝试查找相关信息(有关如何从 Ruby 调用 C 和从 C 调用 Ruby,以及如何在 C 和 Ruby 之间传递数据结构的代码示例)并在gwan.ch给我们留言。

不要忘记检查这些资源是否是线程安全的,因为 G-WAN 是一个多线程应用程序。

于 2013-07-24T07:13:50.870 回答