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 --versioncross 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-releaseNAME="Ubuntu"VERSION="18.04.6 LTS (Bionic Beaver)"...VERSION_CODENAME=bionicUBUNTU_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 GLIBCGLIBC_2.2.5....GLIBC_2.24GLIBC_2.25GLIBC_2.26GLIBC_2.27GLIBC_PRIVATEGNU 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
参考浏览
cross
官网github readme