LoginSignup
6
3

More than 3 years have passed since last update.

Cargoからrlibファイルをリンクする

Last updated at Posted at 2021-01-13

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

Config.toml
[dependencies]
my_crate= "0.1.12"

2. 普通のケース(ローカルのクレートをリンク)

Config.tomlにそのクレートのパスを記述します.

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に

lib.rs
#![doc(html_no_source)]

pub mod hoge;
....

と記述すればソースはドキュメント内に追加されません.

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3