在像C这样的语言中,我们处理三种不同的翻译单元:目标文件,库和可执行文件。如果我理解正确,Rust会跳过第一个。也就是说,如果我想将我的项目划分为几个翻译单元,则必须使用本地包装箱,如blog所示。
如果一个人几乎在代码中的任何地方都使用了extern crate(E)(即我的本地lib crate和二进制crate),则必须在所有Cargo.toml依赖项中都包含E。
问题:

  • 这是否意味着在最终的二进制文件中多次包含了E的代码?
  • 如果要更新E的版本,则必须更改所有Cargo.toml文件。有没有其他方法可以指定“公共(public)”依赖项?
  • 引用的方法是惯用的吗?可能的话,Rust社区似乎不主张在工作区
  • 之外的1个子-

    我知道使用动态库在某种程度上是一种解决方案。但是,我的项目是一个嵌入式项目,不支持动态库。
    1这是我个人的印象;抱歉,如果我错了。

    最佳答案



    您无需解释为何要这样做。如果是出于编译性能的原因,那么您可能只想等待更好的增量编译支持。根据所涉及的代码类型,拆分成 crate 可能会或可能不会帮助您节省编译时间-例如,具有高度通用的API的 crate 效益会降低。

    我会说语义/组织原因是将事情分解的最佳原因。



    否。当Cargo执行依赖关系解析时,它将尝试解析每个依赖关系的单个版本。如果您的依赖树具有冲突的版本要求,则可能会包含多个版本,但这仍然是编译此类代码的唯一方法。使用诸如cargo-tree之类的工具可以帮助您找到强制包含多个版本的 crate 。



    您无需更改 Cargo.toml 文件,除非您需要升级到不兼容semver的 crate 版本。您的 Cargo.lock ,该only exists for your final binary是唯一需要更改的文件。



    我看到的主要缺点是,如果要执行类似的操作,则需要发布多个 crate 。如果您只是在构建二进制文件,我认为没有理由不这样做。 Parity是一个较大的二进制项目的示例,该项目由许多较小的 crate 组成。

    关于rust - Extern库作为对本地库的依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45773442/

    10-12 20:09