2017-09-09 6 views
2

私はRuby FFIで完璧に動作する多くの錆関数を持っています。しかし、free_arrayメソッドを作成するための2つの異なるサイトからの指示に従うと、リンクされたライブラリでメソッドを使用できるようにはなりません。錆はlibの関数を作成しませんextern FFI

この例は、Rubyから返されたStringを解放する作業例です。

use libc::c_char; 
use std::ffi::CString; 

#[no_mangle] 
pub extern "C" fn free_string(s: *mut c_char) { 
    unsafe { 
    if s.is_null() { return } 
    CString::from_raw(s) 
    }; 
} 

ここでは、アレイのメモリを解放する方法を実装する2つの試みがあります。

use std::mem::transmute; 
use ruby_array::RubyArray; 

#[no_mangle] 
pub extern "C" fn free_array(ra: *mut RubyArray) { 
    let _ra: Box<RubyArray> = unsafe{ transmute(ra) }; 
} 

// OR 

#[no_mangle] 
pub extern "C" fn free_array(ptr: *mut RubyArray) { 
    if ptr.is_null() { return } 
    unsafe { Box::from_raw(ptr); } 
} 

これはエラーになります:

Function 'free_array' not found in [/libfaster_path.so] (FFI::NotFoundError) 

はここに私が使用している構造体だとどれが錆からルビーにして完全に作成されます。

use libc; 
use std::mem; 

#[repr(C)] 
pub struct RubyArray { 
    len: libc::size_t, 
    data: *const libc::c_void, 
} 

impl RubyArray { 
    #[allow(dead_code)] 
    pub fn from_vec<T>(vec: Vec<T>) -> RubyArray { 
    let array = RubyArray { 
     data: vec.as_ptr() as *const libc::c_void, 
     len: vec.len() as libc::size_t 
    }; 
    mem::forget(vec); 
    array 
    } 
} 

しかし、それは問題ではないため、関係はありません。問題は、FFIが読み込むためのライブラリ出力でメソッドが利用可能になっていないことです。これには何が問題なのですか?錆は幸せで、仕事と同じように他の多くの方法を書いています。これを.soファイルに見つけられないようにするにはどうすればよいですか?

のファイルはpub modとなっていますので、問題はありません。それは他の作業方法と同じです。

後ほど詳しく説明するブログを投稿していきます。興味のある人には、以下のコメントセクションへのリンクを追加します。


マイナーアップデート

私はこれが錆の問題であるかなり確信しています。私はRubyのFiddleとFFIの両方を使って、他のメソッドが両方である可能性がある場合には、このメソッドにアクセスできないことを確認しました。

私はバイナリを覆い、バイナリにfree_arrayメソッドを示すテキストが見つかりましたが、明らかにFFIによって正しく読み込まれるようにコンパイルされていません。

+0

私はRustのGithub https://github.com/rust-lang/rust/issues/44459で問題を開いています –

答えて

0

私が提供した情報は、問題をデバッグするのに十分ではありませんでした。実際の問題は、リリースからデバッグまでのソースをビルドから変更し、それを反映するためにFFIリンクライブラリフォルダを更新していないことでした。だから、コードは古いlibを指していた。

関連する問題