kakts-log

技術・エンジニアリング組織などについて調べたことをまとめます

Cargo.tomlで指定するcrate-typeとcdylibについて

rustにおいて、Cargo.tomlでビルドの成果物としてバイナリや.soなどのライブラリファイルなど様々な形式で出力できますが。この形式は libのcrate_type で指定できます。

...
[lib]
crate-type = ["cdylib"]
...

このcrate-typeと、その中のタイプの一つであるcdylibについてまとめます。

crate-typeとは

Cargo.tomlにおけるcrate-type フィールドは、cargoコマンドによるビルド時に生成されるcrate typeを定義します。

crate-typeフィールドは文字列の配列で指定でき、単一のビルドターゲットに対して複数のcrate タイプを指定できます。

doc.rust-lang.org

バイナリやテスト、ベンチマークの場合はbin を指定します。 そのほかにも、lib rlib dylib staticlib proc-macro が指定できます。
それぞれの詳細についてはrustの公式ドキュメントを確認してください。
doc.rust-lang.org

Cargoのビルドターゲットについての詳細は、下記のCargoに関するドキュメントで確認できます。

doc.rust-lang.org

crate-type : cdylibについて

他の言語で書かれたプログラムや実行ファイルによって FFI(Foreign Function Interface)などによって呼び出されるような動的なシステムライブラリを生成する場合は crate-typeにcdylib を指定します。

これを指定した場合、cargoによってビルドした成果物のファイル形式はOSによって異なります。
例えばLinuxでは*.somacOSでは*.dylibWindowsでは*.dll となります。

(参考) rustにおけるFFI(Foreign Function Interface) について

FFIとは今まで知らなかったのですが、ざっくりいうと、あるプログラム言語で書かれたコードから、別のプログラム言語で書かれた関数などを呼び出す機構のことです。

下記の公式ドキュメントと、ブログ記事が参考になったので読んでみてください。

doc.rust-lang.org

qiita.com