これはなに
Rustの勉強をしていて、Rustで書いたライブラリをCで使ってみたいと思い、簡単なサンプルをつくったので記事にする。
何をやるのか
Rustで共有ライブラリを作成し、C言語で書いたコードのコンパイル時にリンクをする。
今回つくるのは、与えられた2つの引数の足し算・引き算をする関数。
手順
Rustで共有ライブラリをつくる
Rustのライブラリプロジェクトを作成する。
$ cargo new --lib c_with_rust
Cargo.toml
にライブラリターゲットをcdylib
に指定する。
Cargo.toml
[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
関数を定義する。
lib.rs
#[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
を用意する。
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がわからない...