gpt4 book ai didi

ruby - 如何使用 ruby​​ ffi gem 调用 rust 库中的独立函数?

转载 作者:太空宇宙 更新时间:2023-11-03 16:00:25 25 4
gpt4 key购买 nike

ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
rustc 0.13.0-nightly (f168c12c5 2014-10-25 20:57:10 +0000)

我想将 ffi gem 与 rust 结合使用。

我已阅读 this (相当过时的)博客文章,展示了如何做到这一点。

问题是:它不起作用。

这是我的代码:

测试.rs:

fn test(bla: i32) -> i32 { bla*bla }

#[no_mangle]
extern fn _test_wrapper(i: i32) -> i32 {
test(i)
}

测试.rb:

require 'ffi'

module Test
extend FFI::Library
ffi_lib File.absolute_path 'libtest.so'

attach_function :_test_wrapper, [:int32], :int32
end

我这样编译test.rs:

rustc --crate-type dylib test.rs

然后

ruby test.rb

输出:

/home/me/.rvm/gems/ruby-2.1.2/gems/ffi-1.9.6/lib/ffi/library.rb:261:in `attach_function': Function '_test_wrapper' not found in [/home/me/Dokumente/ruby/rust_require/specs/test/libtest.so] (FFI::NotFoundError)
from test.rb:7:in `<module:Test>'
from test.rb:3:in `<main>'

我做错了什么? (我已经尝试过让它成为 pub extern fn ...,也不起作用。)

最佳答案

你已经很接近了,你只需要修复编译 Rust 代码时收到的警告并将函数公开:

#[no_mangle]
pub extern fn _test_wrapper(i: i32) -> i32 {
test(i)
}

为了帮助我调试问题,我使用 nm 查看编译库导出了哪些符号。我在 OS X 上,所以你可能需要调整参数和文件名:

$ nm -g libtest.dylib
0000000000000e30 T __test_wrapper
0000000000001020 S _rust_metadata_test_04c178c971a6f904
U _rust_stack_exhausted
U dyld_stub_binder

在将函数标记为公开之前,它没有出现在这个列表中。

关于ruby - 如何使用 ruby​​ ffi gem 调用 rust 库中的独立函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26702341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com