在 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 有用。
我正在 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 有用。