You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM嵌入式C项目集成Rust库出现链接错误:__divxc3未定义引用

解决ARM嵌入式项目中链接Rust库时compiler-rt函数未定义的问题

你遇到的是Rust生成的静态库依赖LLVM compiler-rt中的长双精度数学辅助函数,但ARM嵌入式编译环境未提供这些函数的链接实现。以下是按优先级排序的解决方案:

1. 强制Rust编译器静态链接完整依赖(最优方案)

通过配置Rust编译参数,让编译器自动将compiler-rt所需部分静态嵌入生成的库,无需手动处理外部依赖。

在Rust项目根目录创建或修改.cargo/config.toml,添加arm-none-eabi目标的配置:

[target.arm-none-eabi]
# 指定交叉编译器
linker = "arm-none-eabi-gcc"
# 强制使用compiler-rt作为运行时库,而非libgcc
rustflags = [
    "-C", "llvm-args=-rtlib=compiler-rt",
    "-C", "llvm-args=-unwindlib=none",
    "-C", "link-arg=-static-libgcc",
    "-C", "link-arg=-lgcc"
]

重新编译Rust库后,生成的rust-lib.a会包含所有依赖的compiler-rt函数,直接链接到C项目即可解决缺失问题。

2. 手动编译并链接compiler-rt

如果上述配置无效,可自行编译对应版本的compiler-rt静态库并手动链接:

  1. 克隆LLVM项目仓库,切换到与你的Rust版本匹配的LLVM分支(Rust的LLVM版本可通过rustc -vV查看)
  2. 用CMake配置交叉编译环境:
cmake -S llvm-project/compiler-rt -B build \
  -DCMAKE_C_COMPILER=arm-none-eabi-gcc \
  -DCMAKE_TARGET_SYSTEM_NAME=Generic \
  -DCMAKE_SYSTEM_PROCESSOR=arm \
  -DCOMPILER_RT_BUILD_BUILTINS=ON \
  -DCOMPILER_RT_BUILD_SANITIZERS=OFF \
  -DCOMPILER_RT_BUILD_XRAY=OFF \
  -DCOMPILER_RT_BUILD_LIBFUZZER=OFF
  1. 编译得到libclang_rt.builtins-arm-none-eabi.a,将其添加到C项目的链接命令中,放在rust-lib.a之后。

3. 重写缺失的函数(仅适合简单场景)

如果项目不涉及复杂的长双精度特殊值处理(如NaN、无穷大),可以手动实现缺失的函数,直接加入C项目编译:

#include <math.h>

long double fmaxl(long double a, long double b) {
    return (a > b) ? a : b;
}

long double logbl(long double x) {
    if (x == 0.0L) return -INFINITY;
    int exp;
    __builtin_frexpl(x, &exp);
    return (long double)(exp - 1);
}

long double scalbnl(long double x, int n) {
    return x * __builtin_ldexp(1.0L, n);
}

注意:这种方式仅能覆盖基础功能,若项目需要严格符合C标准的特殊值处理,建议优先使用前两种方案。

内容的提问来源于stack exchange,提问作者Joel Imbergamo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 22:53:02