🦀

C×Rust#1

2020/12/06に公開

はじめに

2020/11 から始まった、ものづくりをする高校生のための新しい団体、Palettteが主催する Palettte Advent Calendar 2020 の6日目の記事です。

RustからCを呼ぶ

今回はccというクレートを使って
cargo run一発で実行できるようにします。

Rustプロジェクトの作成

cargo new hogeでRustプロジェクトを作成します。

C言語側の設定

C言語側で準備しなければならないことは特にありません。
今回は以下のコードを用意してsrc/c/に保存しました。

hoge/src/c/foo.c
#include<stdio.h>

void palettte(){
    printf("palettte!\n");
}

Rustプロジェクト側の設定

Cargo.tomlに以下のような記述を追加します。

hoge/Cargo.toml
[build-dependencies]
cc = "1.0"

build.rsをプロジェクトディレクトリ直下(src内ではない)に作成し、以下のように記述します。

hoge/build.rs
fn main() {
    cc::Build::new()
        .file("src/c/foo.c") //Cで書いたソースファイル。複数指定可能。
        .compile("foo"); //コンパイル後の名前。今回はlibfoo.aになる。
}

RustでCの関数を呼び出す

main.rsに以下のコードを記述します。また、C側で用意した関数を呼び出す際はunsafeを使用します。

hoge/src/main.rs
#[link(name="foo", kind="static")] //libfoo.cをリンク
extern{
    fn palettte();
}

fn main() {
    unsafe {palettte();};
}

記述後、cargo runで実行しましょう。以下のような実行結果になると思われます。

Discussion