🦀
C×Rust#1
はじめに
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