在 Rust 的 FFI 中,我在哪里指定 link 的文件名?

Where do I specify the filename to link to in FFI for Rust?

我正在 Rust 上试验 FFI,但经过 2 小时的搜索后,我找不到你如何告诉 cargo run 在哪里可以找到你的 C 代码。

我知道 Rust 书中有一个 FFI 章节,但它没有说明 我应该将什么传递给 cargo run 以便它知道我的 C 文件位于 ./c/main.c.

防锈代码:

#[link(name = "main")]
extern {
    fn a() -> u8;
}

fn main() {
    println!("{}", unsafe {
        a()
    });
}

C代码:

char a() {
    return 'A';
}

我是否需要将 C 代码编译为 .o 文件以便 Rust 可以检测到它?如果我需要这样做,我应该把它放在哪里?我在 Windows.

我也尝试添加一个打印 cargo:rustc-link-search=./ 的构建脚本,但没有解决它。

我得到的错误是:

ld: cannot find -lmain

您的 Cargo.toml 应如下所示:

[build-dependencies]
cc = "1.0.32"

您还应该有一个 build.rs 位于与 Cargo.toml 相同的文件夹中:

extern crate cc;

fn main() {
    cc::Build::new()
        .file("src/main.c") //here I specify that main.c is in src folder, you can change the location likewise
        .compile("libmain.a");
}

最后,main.rs 有:

extern "C" {
    fn a() -> u8;
}

fn main() {
    println!("{}", unsafe { a() });
}

在此之后,运行 cargo run 将编译 C 代码并将其 link 作为库,您可能会发现这些 examples 有用。