乐趣区

关于rust:关于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/crosstag 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

退出移动版