2
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ジェムと合わせて使いたいrust

これを行う方法を示すこの(かなり古い) ブログ投稿を読みました。

問題は、機能しないことです。

これが私のコードです:

test.rs:

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

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

test.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...、どちらも動作しません。)

4

1 に答える 1

2

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

関数をパブリックとしてマークする前は、このリストに表示されませんでした。

于 2014-11-02T21:29:23.233 に答える