首页 > 编程语言 >Rust如何引入源码作为依赖

Rust如何引入源码作为依赖

时间:2023-04-03 17:44:40浏览次数:50  
标签:Cargo rlib crate 编译 j4rs 引入 源码 Rust

问题描述

通常我们在rust项目中引入第三方依赖包时,会直接指定包的版本,这种方式指定后,Cargo在编译时会从crates.io这个源中下载这些依赖包。

[package]
name = "foo"
version = "0.1.0"
edition = "2021"

[dependencies]
j4rs = 0.15.3

比如这里我们就在项目中引用了j4rs这个包,这个包的主要作用是可以实现从Rust代码中调用Java代码。

博主在使用这个包时发现,crates.io上发布的最新版本0.15.3有bug,这个版本依赖了logback的新版本,而logback的新版本使用了Java 11进行编译。这就导致了j4rs 0.15.3这个版本不支持Java 8。

于是博主在github上向作者提了issue,作者很快就做了修改,并更新到了github项目的master分支上。然而作者却没有向crates.io推送最新版本的包,我们想用最新版本就不能直接饮用crates.io上的版本。

想要解决这个问题也很简单,我们可以直接引用源码作为依赖,主要有一下两种方式。

方式一

Cargo支持直接引用git最新版本的代码

[package]
name = "foo"
version = "0.1.0"
edition = "2021"

[dependencies]
j4rs = { git = "https://github.com/astonbitecode/j4rs" }

方式二

引用本地源码

[package]
name = "foo"
version = "0.1.0"
edition = "2021"

[dependencies]
j4rs = { path = "../j4rs/rust" }

当我们引用三方包的源码后,编译时Cargo也会根据三方包的Cargo配置编译这些三方包的源码,然后把编译的结果输出到本项目的target/[debug/release]/deps目录下,这样本项目就可以使用这些三方包了。

博主在引用j4rs这个三方包时遇到了这个问题:release编译时,编译器提示,j4rs编译的输出命名冲突

解决方法

查看j4rs源码中的Cargo.toml文件

[package]
name = "j4rs"
version = "0.15.4"
...

[badges]
travis-ci = { repository = "astonbitecode/j4rs", branch = "master" }

[lib]
name = "j4rs"
crate-type = ["rlib", "cdylib"]
path = "src/lib.rs"

可以发现crate-type这个里配置了两种编译结果crate类型。

crate类型

bin: 二进制可执行 crate,编译出的文件为二进制可执行文件。必须要有 main 函数作为入口。这种 crate 不需要在 Cargo.toml 中或 --crate-type 命令行参数中指定,会自动识别。
lib: 库crate。它其实并不是一种具体的库,它指代后面各种库 crate 中的一种,可以认为是一个代理名称(alias)。通常来讲,如果什么都不配置,默认指的是 rlib, 会生成 .rlib 的文件。
dylib: 会在编译的时候,生成动态库(Linux 上为 .so, MacOS 上为 .dylib, Windows 上为 .dll)。动态库是平台相关的库。动态库在被依赖并链接时,不会被链接到目标文件中。这种动态库只能被 Rust 写的程序(或遵循 Rust 内部不稳定的规范的程序)调用。这个动态库可能依赖于其它动态库(比如,Linux 下用 C 语言写的 PostgreSQL 的 libpq.so,或者另一个编译成 "dylib" 的 Rust 动态库)。
staticlib: 静态库。编译会生成 .a 文件(在 Linux 和 MacOS 上),或 .lib 文件(在 Windows 上)。编译器会把所有实现的 Rust 库代码以及依赖的库代码全部编译到一个静态库文件中,也就是对外界不产生任何依赖了。这特别适合将 Rust 实现的功能封装好给第三方应用使用。
cdylib: C规范动态库。与 dylib 类似,也会生成 .so, .dylib 或 .dll 文件。但是这种动态库可以被其它语言调用(因为几乎所有语言都有遵循 C 规范的 FFI 实现),也就是跨语言 FFI 使用。这个动态库可能依赖于其它动态库(比如,Linux 下用 C 语言写的 PostgreSQL 的 libpq.so)。
rlib: rlib 是 Rust Library 特定静态中间库格式。如果只是纯 Rust 代码项目之间的依赖和调用,那么,用 rlib 就能完全满足使用需求。rlib 实现为一个 ar 归档文件。rlib 中包含很多 metadata 信息(比如可能的上游依赖信息),用来做后面的 linkage。可以指定生成 rlib,但是一般没必要设置,因为默认 lib 就是 rlib。rlib 是平台(Linux, MacOS, Windows ...)无关的。
proc-marco: 这种 crate 里面只能导出过程宏,被导出的过程宏可以被其它 crate 引用。

具体解释

根据文档j4rs设置的两种crate类型,rlib表示rust本身定义的中间结果,如果rust代码互相引用,直接使用这种类型就可以。cdylib是符合c标准的动态链接库,这种方式编译的结果可以被其他语言作为动态库使用。

当我们进行release编译时,Cargo会根据配置帮我们编译j4rs这两种格式的目标输出。
这时Cargo就会提示我们输出了一个libj4rs.rlib文件,又要输出一个libj4rs.so文件,这两个库文件名字一样,冲突了。这会导致我们的代码在链接j4rs时无法选择应该使用哪个库。

因此解决方法是:只要在j4rs的源码里将Cargo.toml文件中的配置crate-type = ["rlib", "cdylib"]改为crate-type = ["rlib"]就可以了。

标签:Cargo,rlib,crate,编译,j4rs,引入,源码,Rust
From: https://www.cnblogs.com/leometeor/p/17283763.html

相关文章

  • spring源码各个版本中的两个字符串比较的变更,值得学习
    判断一个字符串是否空串:1、Spring旧版本使用equals,新版本使用isEmpty()方法;查找String的源码发现isEmpty的底层使用this.value.length==0进行判断。粗略分析:equals在进行比较时耗时约0.1秒,==无耗时。 ......
  • Flask框架cbv的写法、请求与响应、请求扩展、session源码分析、闪现
    本篇文章将会详细讲在flask框架如何写cbv、请求与响应、请求扩展、session源码分析、闪现等知识点。目录一、flask写CBV二、请求与响应三、session四、闪现flash五、请求扩展一、flask写CBVCBV源码分析的结论如下1as_view执行流程跟djagno一样2路径如果不传别名,别名就是......
  • 《渗透测试》信息打点-小程序应用&解包反编译&动态调试&抓包&静态分析&源码架构 2023
     #小程序获取-各大平台&关键字搜索-微信-百度-支付宝-抖音头条 #小程序体验-凡科建站&模版测试上线测试:https://qz.fkw.com/参考:https://blog.csdn.net/qq_52445443/article/details/1223518651.主体结构小程序包含一个描述整体程序的app和多个描述各自页面的pa......
  • js 头像上传(图片截取) 插件 全屏高清版 源码
    先上图片 index.html<!DOCTYPEhtml><html><head><metaname="viewport"content="width=device-width"/><title>ccp</title><linkhref="Content/ccp.css"rel="stylesheet"......
  • FastThreadLocal源码解析
    Netty为什么要用自己的FastThreadLocal?threadLocalHash冲突,检索时间长。Netty自己定义的fastThreadLocal用的是数组,直接数组下标检索快。下面以ftl作为FastThreadLocal的简称例子ftl只有在FastThreadLocalThread线程中运行才生效,不然会走SlowGet模式(jdkthreadLocal方式)publiccl......
  • 1 cbv分析、2 模板、3 请求与响应 、4 session及源码分析、5 闪现、 6 请求扩展
    目录1cbv分析1.1源码分析2模板2.1py2.2html3请求与响应4session及源码分析4.1session的使用4.2源码分析4.3session执行原理5闪现6请求扩展1cbv分析#基于类的视图,写法fromflaskimportFlask,requestfromflask.viewsimportView,MethodViewapp=Flask(__......
  • ORB_SLAM3源码阅读笔记(三)
    LocalMapping线程    与Tracking线程一样,同样从LocalMapping线程的创建开始逐步对LocalMapping进行分析。1LocalMapping线程的创建mpLocalMapper=newLocalMapping(this,mpAtlas,mSensor==MONOCULAR||mSensor==IMU_MONOCULAR,mSensor==IMU_MONOCULAR||mSensor==......
  • cbv分析、模板、请求与响应、session及源码分析、闪现、请求扩展
    目录1cbv分析1.1源码分析2模板2.1py2.2html3请求与响应4session及源码分析4.1session的使用4.2源码分析4.3session执行原理5闪现6请求扩展1cbv分析#基于类的视图,写法fromflaskimportFlask,requestfromflask.viewsimportView,MethodViewapp=Flask(__......
  • 成品直播源码推荐,Android 禁止下拉菜单栏
    成品直播源码推荐,Android禁止下拉菜单栏1.屏蔽非锁屏下的下拉菜单栏这种Android系统其实是提供了方法的,只不过是隐藏的,只给系统应用,也就是用mk编译的apk使用。如果第三方应用想要使用,或者Androidstuido编译方式的想要使用。则可以使用反射。 /** *Allowsanapptoco......
  • wangeditor 引入国际化支持
    看了wangeditor的源码,发现是有翻译支持的: 且内置了中英文: 那现在的问题就变成了如何使用,根据地址查看文档(https://www.i18next.com/overview/getting-started)发现只需要下载并引入即可: 那本地editor就可以设置配置:importi18nextfrom'i18next';instance.......