概要

Rust の関数をCから呼びたい、それだけです。

やりかた

Rust で関数を定義

 

ここをフォローします。

まず、Rust のプロジェクトを以下のように作ります。

cargo new test-c
[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です。

#[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
#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の関数を呼ぶということが必要になったので試してみました。
かなり特殊なシチュエーションだとは思いますが、どなたかの役に立てば幸いです。

今回はこの辺で。

@kenmaro

广告
将在 10 秒后关闭
bannerAds