2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

KenmaroAdvent Calendar 2022

Day 8

Rust の関数をCから呼びたい時の物語

Last updated at Posted at 2022-12-08

概要

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.hlibmycrate.dylib をコピーします。

コピーできたら、

g++ test.cpp -lm libmycrate.dylib
./a.out

で、

hello from c
hello, from rust!

と出力されたら完了です、
お疲れ様でした!

まとめ

今回は、CからRustの関数を呼ぶということが必要になったので試してみました。
かなり特殊なシチュエーションだとは思いますが、どなたかの役に立てば幸いです。

今回はこの辺で。

@kenmaro

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?