RustでGoのライブラリを使うときのCargoのbuild.rsの書き方
こんにちは。長男の保育園最後の運動会は、雨天のため、室内でのダンスの発表のみになり、次男、長男とも曲に合わせて踊るのを見学できました。@kjunichiです。
背景
gccなるクレートがあり、この使い方を知っているとC言語のライブラリを使う際はこれで便利に実現できそう。 C以外の言語をRustで使う際にどうすれば実現できるかをGoで試した。
build.rsの記述
GitHubからコードを持ってくる
以下のコードでGoのソースをgit clone出来た。
Command::new("git").args(&["clone","https://github.com/kjunichi/libimgtype.git"]) .status().unwrap();
持ってきたコードをgoでビルドして共有ライブラリを作成する
cloneしたディレクトリに入って、goのコマンドを実行する、という動作は 以下のコードで出来た。
let out_dir = env::var("OUT_DIR").unwrap(); Command::new("go").args(&["build","-buildmode=c-archive","-o"]) .arg(&format!("{}/lib/libimgtype.a", out_dir)) .current_dir(Path::new("libimgtype")) .status().unwrap();
以上、でGoでlibhoge.aを作ることのができるライブラリをソースからビルドしてCargo内で 扱うことができた。
まとめ
RustからGoの便利なライブラリを共有ライブラリ化して使う方法を編み出せた! LinuxやMacではc-archiveでRustのプロジェクトに静的リンクしてしまっても 問題なさそうだが、Windowsの場合、c-archive形式だとMinGWのバイナリなのでMSVCな Rustだとリンクエラーになりそうな予感。
晴れてWindowsでのGoで共有ライブラリの出力出来れば、今回の方法で対応出来そうではある。
関連投稿
関連記事
- RustでOpenGLやGLSLやる準備
- Rustで多次元配列を扱うには
- RustでFaceTime HDカメラやWebカメラを使う
- libtrusterdをRustで動かした
- macOS Sierraにしたらrustが暴走して、黒い画面には入れなくなった #解決済み
- Rust入門者向けハンズオン #2 に行ってきた - non vorrei lavorare
- Rustでコマンドラインアプリでキーが押されたかの判定しつつ、別の処理も進めるには
- RustでWebカメラの映像をコマンドプロンプトに出すコマンドを作った
- Surface Goのカメラ映像をRustでコマンドプロンプトに表示した