non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

libtrusterdをRustで動かした

おはようございます。奥さん出張中の息子達との実家生活もそろそろ終了です。kjunichiです。

 

TL;DR

https://github.com/trusterd/libtrusterd/tree/master/examples/trusterd_rs

初めに

Rustも1.0がリリースされたり、rebuildfmでもRustが話題になった回もあったので、また、懲りずにやってみることにした。

libtrusterdをRustで動かそうとして学べたこと

Cの文字列を扱う

以前は、

title.with_c_str(| title | unsafe {
    cvNamedWindow(title);
}

と変換していたところ、1.0以降は以下のようになった。

Link

 

 

 

 

int型

int型がなんとなくなっていた!

i32でOK?

関数ポインタの扱い

File: src.rs

-------------------------

extern { fn puts(s: *const libc::c_char); }

extern "C" fn callback(target: *const libc::c_char) -> c_int {

println!("This is Rust.I'm called from mruby");

unsafe {

puts(target);

}

return 0;

}

extern {

fn boot(cb: extern fn(* const libc::c_char) -> c_int ) -> c_int;

}

fn main() {

unsafe {

boot(callback);

}

}

use with Gist Search

C側に渡すコールバック関数は、extern "C"で始め、使う方はlibc由来のモノを使用するくらいがポイント。

Cargoで-Lをするには

rustcでは-Lを指定できるが、Cargoではこれが簡単には出来ず、解決方法が分かったのでうれしさ余って思わずQiitaに投稿してしまった。

あとがき

そんな訳で、

時雨堂のファウンダーの方も

と興味を持っていただいたRustでFaceTime HDカメラやWebカメラを使う

の記事に書いたコードを近々Rust1.1.0に対応した版をこのブログで公開予定です。

関連記事