这个问题在这里已有答案:
我正在试验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
您的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很有用。