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静态库并手动链接:
- 克隆LLVM项目仓库,切换到与你的Rust版本匹配的LLVM分支(Rust的LLVM版本可通过
rustc -vV查看) - 用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
- 编译得到
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
相关产品推荐
相关产品推荐

