Rust静态库引用时链接器缺失littlefs-sys库函数问题求助
解决方案
- 固定依赖版本
搁置项目期间littlefs2相关依赖可能发布了不兼容更新,Rust nightly版本更新也可能触发依赖解析逻辑变化。直接在静态库的Cargo.toml中锁定littlefs2和littlefs2-sys的版本到之前正常运行的版本,参考写法:
littlefs2 = "=x.y.z" littlefs2-sys = "=a.b.c"
你可以从历史正常构建生成的Cargo.lock文件中查询对应版本号替换占位符。
- 强制静态库包含依赖符号
新版Rust nightly调整了静态库的符号导出默认逻辑,依赖的sys crate符号默认不会打包到静态库输出中。在静态库的Cargo.toml中添加如下配置:
[lib] crate-type = ["staticlib"] rustflags = ["-C", "link-dead-code=yes"]
如果是no_std环境可以额外添加-C embed-bitcode=yes参数。
- 调整链接参数
在引用该静态库的项目的.cargo/config.toml中添加如下配置,强制链接器加载静态库的全部符号:
[target.armv5te-none-eabi] rustflags = [ "-C", "link-arg=-Wl,--whole-archive", "-C", "link-arg=-lrustify", "-C", "link-arg=-Wl,--no-whole-archive", ]
回退Rust nightly版本
如果确认是Rust版本更新导致的兼容问题,用rustup指定回退到一个月前的nightly版本即可,参考命令:rustup override set nightly-YYYY-MM-DD
替换日期为之前正常构建时使用的nightly版本日期。清理构建缓存
清空全局cargo缓存和项目target目录,重新全量构建,避免不同目标架构的缓存文件互相干扰。
内容的提问来源于stack exchange,提问作者Farbod PM
相关产品推荐
相关产品推荐

