我在哪里指定要在FFI for Rust中链接到的文件名? [重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

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

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

Rust代码:

#[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
c rust ffi
1个回答
2
投票

您的Cargo.toml应如下所示:

[build-dependencies]
cc = "1.0.32"

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

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代码并将其链接为库,您可能会发现这些examples很有用。

© www.soinside.com 2019 - 2024. All rights reserved.