これはなに
Rustの勉強をしていて、Rustで書いたライブラリをCで使ってみたいと思い、簡単なサンプルをつくったので記事にする。
何をやるのか
Rustで共有ライブラリを作成し、C言語で書いたコードのコンパイル時にリンクをする。
今回つくるのは、与えられた2つの引数の足し算・引き算をする関数。
手順
Rustで共有ライブラリをつくる
Rustのライブラリプロジェクトを作成する。
$ cargo new --lib c_with_rust
Cargo.tomlにライブラリターゲットをcdylibに指定する。
[package]
name = "c_with_rust"
version = "0.1.0"
edition = "2021"
+[lib]
+name = "c_with_rust"
+crate-type = ["cdylib"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
lib.rsに#[no_mangle]とpub extern “C”をつけ、add/sub関数を定義する。
#[no_mangle]
pub extern "C" fn add(x: i32, y: i32) -> i32 {
x + y
}
#[no_mangle]
pub extern "C" fn sub(x: i32, y: i32) -> i32 {
x - y
}
これで、cargo buildをすると、target/debug配下に共有ライブラリが作成される。
C言語でつくった共有ライブラリを使う
Rustで定義した関数のプロトタイプ宣言を含め、main.cを用意する。
#include <stdio.h>
int add(int x, int y);
int sub(int x, int y);
int main() {
int x = 3;
int y = 2;
printf("add: %d\n", add(x, y));
printf("sub: %d\n", sub(x, y));
return 0;
}
コンパイルをする。
$ gcc main.o -L./target/debug -lc_with_rust -o main
実行して動作を確認。
$ ./main
add: 5
sub: 1
さいごに
C→Rustはなんとなくわかってきたが、Rust→Cがわからない…
Refs
-
- Cと少しのRust – The Embedded Rust Book
-
- Cargo Targets – The Cargo Book
-
- Linkage – The Rust Reference
-
- RustのABIと共有ライブラリ – mox692 のブログ
-
- Rustで動的リンクライブラリを作る / 読み込む – かおるノート
- APIとかABIとかシステムコールとか – 覚書