これはなに

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とかシステムコールとか – 覚書
广告
将在 10 秒后关闭
bannerAds