概要
Rust の関数をCから呼びたい、それだけです。
やりかた
Rust で関数を定義
ここをフォローします。
まず、Rust のプロジェクトを以下のように作ります。
cargo new test-c
Cargo.toml
[package]
name = "test-c"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
[lib]
name = "mycrate"
crate-type = ["cdylib"] # Creates dynamic lib
# crate-type = ["staticlib"] # Creates static lib
Cから呼びたい関数を定義します。
rust_function
です。
src/lib.rs
#[no_mangle]
pub extern "C" fn rust_function() {
println!("hello, from rust!");
}
準備できたら、build します。
cargo build
target/debug/libmycrate.dylib
のようなdylib ファイル(もしくはsoファイル)が生成されます。
cbindgen でC用のヘッダー作成
上のgithubに従います。
cargo install --force cbindgen
cbindgenがインストールできたら、
先ほどのRust プロジェクトの中で、
cbindgen --config cbindgen.toml --crate test-c --output my_header.h
とすると、
my_header.h
が生成されていることがわかります。
C から呼ぶ
C用のフォルダを作ったとします。
mkdir test-folder
cd test-folder
touch test.cpp
test.cpp
#include <iostream>
#include "my_header.h"
int main(){
printf("hello from c\n");
rust_function();
}
このフォルダに、先ほどの
my_header.h
、libmycrate.dylib
をコピーします。
コピーできたら、
g++ test.cpp -lm libmycrate.dylib
./a.out
で、
hello from c
hello, from rust!
と出力されたら完了です、
お疲れ様でした!
まとめ
今回は、CからRustの関数を呼ぶということが必要になったので試してみました。
かなり特殊なシチュエーションだとは思いますが、どなたかの役に立てば幸いです。
今回はこの辺で。