问题
开发XWRUST的过程中,需要将库与应用的代码分离在不同的crate中,在实践过程中,
发现RUST有如下局限:
- 不能将两个crate都编译成staticlib,staticlib的crate不可列举在
[dependencies],
说明staticlib是用来给C/C++调用的; - 只有rlib的crate列举在
[dependencies],编译staticlib时,
所有[dependencies]内的crates都会打包在staticlib内; - 与C/C++代码链接时,不可存在两个以上的staticlib,除非这些staticlib的依赖完全
无关系(事实上这很难实现),否则会出现重复定义的错误。
解决方法
通过实践,研究出解决方法:
- 将
xwrust_main()移动到一个电路板模块bm/rustapp中,此模块编译成staticlib; - 所有RUST的应用只能集中在rustapp内;
- 其他crates只作为rustapp的
[dependencies]; - 其他crate设置为
crate-type = ["rlib"],并删除xwmo.mk不再使用XWOS的编译系统进行编译。
实验代码
- 代码仓库:
git clone --recursive https://gitee.com/xwos/WeActMiniStm32H750.git - commit:
4d0837bfe227a6316288e4f1fa60a15276504159
cd XWOS
git pull
git checkout -b rust-multicrates 4d0837bfe227a6316288e4f1fa60a15276504159

这篇博客探讨了在Rust开发过程中遇到的库与应用代码分离的问题,特别是关于编译staticlib的限制。作者指出,RUST不支持将两个staticlib同时用于[dependencies],因为这可能导致重复定义错误。为了解决这个问题,提出了一个解决方案:将核心代码移到单独的crate并编译为staticlib,其他依赖项作为rlib编译,并调整项目结构以避免静态库冲突。实验代码可以在提供的Git仓库中找到。

被折叠的 条评论
为什么被折叠?



