C言語で書いた関数をRustから呼ぶ

まず Rust のプロジェクトを作る:

cargo new rust-c-example

C言語のプログラムを適当に作り,lib/spam.c に配置する.ディレクトリ構成やファイル名は任意だが,Rust のプログラムディレクトリ (src/ 以下) は避けるのが慣例っぽい.

#include<stdio.h>

void spam() {
    printf("spam ham egg\n");
}

int add(int a, int b) {
    return a + b;
}

src/main.rs にC言語の関数を呼び出すコードを書く:

extern "C" {
    fn spam();
    fn add(a: i32, b: i32) -> i32;
}

fn main() {
    unsafe { spam(); };
    let answer = unsafe { add(10, 32) };
    println!("{:}", answer);
}

Cargo.toml にビルドスクリプト名と cc パッケージを追加する:

[package]
name = "rust-c-example"
version = "0.1.0"
edition = "2021"
build = "build.rs"

[dependencies]

[build-dependencies]
cc = "1"

ビルドスクリプト build.rs を書く:

fn main() {
    cc::Build::new()
        .file("lib/spam.c")
        .compile("spam");
}

プログラムをビルドおよび実行する:

cargo run

実行すると以下の結果が得られる:

spam ham egg
42

おわり