将Rust staticlib与嵌入式C程序链接时出现“ memcmp的多个定义”错误

费迪亚·麦克基(Ferdia McKeogh)

我有一个Rust函数,我想从一个运行在STM32F412 MCU上的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)]但这与我想要的完全相反,因为如果您收到“未定义的引用”链接器错误。

Attdona

您有一堆重复的符号,这些符号来自您的自定义“标准库”liba和生成的内置符号librust.a

memset, memcpy, memmove, ecc, ecc

出现问题是因为链接时目标文件的顺序很重要。

如果将librust.a文件放在有序的链接顺序中过早,则“之前”的文件librust.a将解析“”的符号,librust.a而“之后”的文件librust.a将解析“”的相同符号liba,这将产生重复的符号错误。

为避免此问题,请将Rust库放在目标文件的末尾以进行链接。

在epsilon Makefile中,将链接命令更改为:

RUST_LIB_DIR = <path_to_librust.a>

.SECONDARY: $(objs)
%.$(EXE):
    @echo "LD      $@"
    $(Q) $(LD) $^ $(LDFLAGS) -L$(RUST_LIB_DIR) -l:librust.a -o $@ 

这个食谱在我这边成功链接了。我的基本epsilon/apps/main.cpp仪器:

#include "global_preferences.h"
#include "apps_container_storage.h"

extern "C" int hello_world(int a, int b);

void ion_main(int argc, char * argv[]) {

  hello_world(1,2);
  ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将嵌入式程序分为内存中的多个部分

将多个嵌入式单选按钮组与标签垂直对齐(引导程序3)

Rust 嵌入式应用程序在 AArch64 系统下链接不正确

将Python列表传递给嵌入式Rust函数

链接错误:多个定义

通过嵌入式DLL将多个应用程序连接到一个Firebird数据库

使用嵌入式框架运行应用程序时出现 Xcode 错误

使用动态版本的Python执行嵌入式python代码时出现致命Python错误

Rust:将枚举用于新结构时出现奇怪的错误消息

将链接的图像转换为嵌入式图像

将图像插入为嵌入式而不是链接

使用memcmp()时出现段错误

使用memcmp时出现段错误

将Rust任务嵌入到C程序中?

与外部库链接时出现GCC“多个定义”错误

链接到boost :: process 0.6时出现“多个定义”错误

...链接器错误的多个定义

在#Include指令中使用C文件时,C程序中出现错误(多个定义错误)

链接C但仅在MinGW上出现“多个定义”错误

错误:将字节码转换为dex时出错:多个dex文件定义

Rust 嵌入式存储外设

将排序与 seq::index::sample 一起使用时出现 Rust 错误

如何将多个Rust文件编译到单个C库中?

多个c ++文件导致“多个定义”错误?

将头文件与struct / array一起使用时出现指针问题,导致多个定义错误(C)

将Python嵌入C:链接错误-对PyString_AsString的未定义引用

C嵌入式将float转换为int

尝试使用嵌入式JDK而非自定义安装时,Android Studio显示错误

如何将嵌入式JSON拼凑成多个文档