Rustのlibクレートをbuildすると.rlibファイルが出来上がります。
通常, cargoのconfig.tomlに依存関係を記述すれば, 他のクレートでも勝手にリンクしてくれますが,
もし実装を公開せずにリンクしたいという場合のケースについて紹介します.
fn main() {
my_crate::my_mod::my_func();
}
1. 普通のケース(crates.ioのクレートをリンク)
Config.tomlにそのクレートを依存関係として記述するだけです.
https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html
[dependencies]
my_crate= "0.1.12"
2. 普通のケース(ローカルのクレートをリンク)
Config.tomlにそのクレートのパスを記述します.
[dependencies]
my_crate= { path = "path_to_my_crate" }
3. 紹介するケース(手元にあるrlibファイルをリンク)
予めmy_crateをビルドして.rlibファイルを作成しておき,
cargoビルド時にmy_crateをリンクするオプションを渡します.
cargo rustc -- --extern my_crate=libmy_crate.rlib
cargoのrustcオプションの説明はこちらにあります.
https://doc.rust-lang.org/cargo/commands/cargo-rustc.html
cargo rustc
では --
以降のコマンドをrustcへのオプションとして渡せます.
今回の例では--extern my_crate=libmy_crate.rlib
がrustcに渡されます.
rustcを直接叩いてビルドしてもいいのですが, Cargo.tomlの依存関係に記述したクレート(hoge_crate)については, cargoが自動で--extern hoge_crate==hoge_crate_rlib_path
オプションをつけて, クレートをビルドしてくれます.
ですので, リンクしたいrlibファイルのみ明示的にexternしたほうが手軽です.
なお, rustcからrlibファイルのリンク方法がこちらにあります.
https://doc.rust-lang.org/stable/rust-by-example/crates/lib.html
ちなみに, cargo build
時にcargo build --verbose
をつけると,
実際にcargoが実行しているコマンドが確認できます.
CargoはConfig.tomlに記述した依存クレートをダウンロード&rlibファイルのビルドを行い,
ビルドするクレートに依存クレートのrlibファイルをリンクしています.
rlibファイルでのリンクのデメリット
VScodeなどでrlsを使用できません.(多分) なので, rlsがそんなクレートはないと怒ってきます.
実装を隠したいケースでしかメリットが薄いです.
個人利用ではあまりないと思いますが, 企業だと案外使うかもしれません.
なお, Cのオブジェクトファイルと異なり, ヘッダーのみ開示というやり方もできません. (多分)
Rustの場合APIをドキュメント化してrlibファイルと合わせて配布することになると思います.
その際は,
lib.rsに
#![doc(html_no_source)]
pub mod hoge;
....
と記述すればソースはドキュメント内に追加されません.