我是一名有用的助手,可以为您翻译文本。
我有一个 Rust 函数想要从运行在 STM32F412 微控制器上的 C 项目 中调用,但我得到了一系列“多重定义”的链接错误。
这是我的 lib.rs:
我有一个 Rust 函数想要从运行在 STM32F412 微控制器上的 C 项目 中调用,但我得到了一系列“多重定义”的链接错误。
这是我的 lib.rs:
#![crate_type = "staticlib"]
#![feature(lang_items)]
#![no_std]
#![no_builtins]
#[no_mangle]
pub extern "C" fn hello_world(a: i32, b: i32) -> i32 {
a + b
}
#[lang = "eh_personality"] extern fn eh_personality() {}
#[lang = "panic_fmt"] fn panic_fmt() -> ! { loop {} }
使用 cargo build --release --target=thumbv7em-none-eabihf
构建会生成 librust.a
,我将其作为对象添加到了 C 语言的 Makefile 中。
完整的链接错误列表可以在这里找到。使用 nm
命令可以将所有冲突的函数显示为全局文本符号 (T),输出结果在此处。
C 语言项目没有标准的 C 库,而是使用自定义的 libc,它是特定设备上的实现,并覆盖了标准库的一小部分。我能告诉 Rust 库使用这些函数吗?
通过阅读 Rust 功能列表,发现有 #![feature(compiler_builtins_lib)]
,但这恰恰与我想要的相反,因为它会导致出现 "undefined reference to" 链接错误。
nm librust.a
和你的Cargo.toml
吗?你是如何链接你的程序的? - Stargateur