关于rust交叉编译的问题
rust
交叉编译
依赖项目https://github.com/cross-rs/cross
安装
$ cargo install cross
该项目需要依赖docker
或者podman
获取镜像的时候由于是直接拉ghcr.io/cross-rs/*
的镜像,所以国内配置的镜像是无法使用的,这个时候需要配置docker
的代理服务才行
查看docker
服务配置文件位置
$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
依据上面命令输出,修改文件/lib/systemd/system/docker.service
配置HTTP
代理,代理的参数值需要依据自己代理而调整
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:20171"
Environment="HTTPS_PROXY=http://127.0.0.1:20171"
重启服务
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
执行交叉编译
使用的时候需要把cargo
替换为cross
命令
$ cross build -r --target x86_64-pc-windows-gnu
执行的时候会自动拉取一个镜像ghcr.io/cross-rs/x86_64-pc-windows-gnu:{version}
,version
参数的值是默认依据cross
的版本号定的,比如执行命令如下,发现版本号是0.2.5
,则对应的获取镜像是ghcr.io/cross-rs/x86_64-pc-windows-gnu:0.2.5
$ cross --version
cross 0.2.5
[cross] note: Falling back to `cargo` on the host.
cargo 1.68.0 (115f34552 2023-02-26)
编译时候的报错解决
该错误一般会出现在rust
以及第三方库版本非常新,但是cross
的版本是比较久之前发布的
目前cross
的版本是0.2.5
,对应的tag
值也是一样
编译过程当中会出现如下错误,表示找不到某个GLIBC
版本
error: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by /target/release/deps/libfutures_macro-7a167e0564403030.so)
查看容器基础镜像信息
$ docker run ghcr.io/cross-rs/x86_64-pc-windows-gnu:0.2.5 cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
...
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
查看支持的GLIBC
版本信息
$ docker run ghcr.io/cross-rs/x86_64-pc-windows-gnu:0.2.5 strings /lib/x86_64-linux-gnu/libc.so.6|grep GLIBC
GLIBC_2.2.5
....
GLIBC_2.24
GLIBC_2.25
GLIBC_2.26
GLIBC_2.27
GLIBC_PRIVATE
GNU C Library (Ubuntu GLIBC 2.27-3ubuntu1.6) stable release version 2.27.
解决步骤
- 切换到项目
https://github.com/cross-rs/cross
的tag v0.2.5
查看文件cross/docker/Dockerfile.x86_64-pc-windows-gnu
发现第一行确实是FROM ubuntu:18.04
- 这个时候浏览器直接访问地址
ghcr.io/cross-rs/x86_64-pc-windows-gnu
,会跳转到https://github.com/cross-rs/cross/pkgs/container/x86_64-pc-windows-gnu
- 发现镜像的
tag
列表当中存在edge
或者main
,镜像很新,对应的是main
分支的镜像,一般使用这种tag
的镜像基本可以解决99%
的GLIBC
版本找不到的问题,虽然不是release
版本的tag
,但是rust
的程序只要可以成功编译出来,就基本不用有什么执行问题的,可以放心使用 在项目根目录下面(与
Cargo.toml
同级)创建一个文件Cross.toml
写入如下[target.x86_64-pc-windows-gnu] image = "ghcr.io/cross-rs/x86_64-pc-windows-gnu:edge"
之后再次执行编译就会使用最新的
edge
镜像了$ cross build -r --target x86_64-pc-windows-gnu
参考阅读
推荐阅读
linux获取存储设备信息
linux系统挂载了存储设备之后会有一些信息生成,这时候可以通过一些命令查看获取存储设备的信息有些命令和工具可能系统没有自带,需要执行安装操作,像Ubuntu系统一般执行apt install 工具名称就可以了/proc/part...
龚正阳阅读 209
Aliyun-使用Docker方式安装Jenkins
之前自己在阿里云ECS上面安装了Jekins(安装jenkins的文章),最近因为服务器中了挖矿木马于是准备重新安装一下,但是想到每次安装jenkins都要手动安装jdk、maven、docker、kubectl,感觉好麻烦,于是使用官方推荐...
Awbeci赞 2阅读 2.1k
Win10 安装Docker以及Jenkins(超级详细篇)
安装Docker下载地址:[链接] ,按照它的指引教程,无脑下一步即可。安装成功后电脑会重启。打开docker桌面端,会显示进入链接,下载WSL 安装包进行无脑安装即可。安装 Linux 内核更新包 (重启电脑)重启 Docker ...
九旬赞 3阅读 1.1k
Redis集群容器化安装
主从复制在数据库中很常见,一般用来做读写分离,Redis中也是如此。要求只有1个Master(主节点),可以有N个slaver(从节点),而且Slaver也可以有自己的Slaver,由于这种主从的关系决定他们是在配置阶段就要指定...
KerryWu赞 2阅读 2.3k
前端切图仔入门Docker,三分钟上线自己的博客平台
依稀记得2022年趁某平台优惠买了台云服务器,周未准备安装MySQL数据库,两天时间卡在MySQL环境配置上,实在是折磨一气之下把服务器给退了。
凌览赞 2阅读 550
【从零开始】Docker Desktop:听说你小子要玩我
由于本狗近期项目紧任务重,高强度的搬砖导致摸鱼时间下降。在上线项目时,看到运维大神一系列骚操作,docker+k8s的知识如过眼云烟,忘得干净的很。所以想重新恶补一下docker知识,但又碍于服务器资源有限,只能...
JavaDog程序狗赞 2阅读 303评论 2
一个非常轻量的静态资源服务器
一个非常轻量的静态资源服务器这个静态服务器的主要目的就是为了部署静态资源,也只具有静态访问功能,不适用于接口开发或者资源重定向。项目地址:docker ikrong/mini-http目前支持的功能如下支持静态资源访问单...
ikrong阅读 2.2k评论 2
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。