rust交叉编译问题及报错解析

发布日期:2025-01-03 16:57    点击次数:125

rust交叉编译 纯粹的rust代码是很容易实现交叉编译,但是使用到的库中如果使用到C/C++,编译就会比较复杂,直接运行交叉编译命令如下,可能直接报错 交叉依赖于项目https://github.com/cross-rs/cross 利用docker简化了在x86_64的linux操作系统上进行交叉编译时所需要的前置设置 安装 该项目需要依赖docker或者podman 获取镜像的时候由于是直接拉ghcr.io/cross-rs/*的镜像,所以国内配置的镜像是无法使用的,这个时候需要配置docker的代理服务才行 查看docker服务配置文件位置 依据上面命令输出,修改文件/lib/systemd/system/docker.service配置HTTP代理,代理的参数值需要依据自己代理而调整 重启服务 执行交叉编译 使用的时候需要把cargo替换为cross命令 执行的时候会自动拉取一个镜像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 编译时候的报错解决 该错误一般会出现在rust以及第三方库版本非常新,但是cross的版本是比较久之前发布的 目前cross的版本是0.2.5,对应的tag值也是一样 编译过程当中会出现如下错误,表示找不到某个GLIBC版本 查看容器基础镜像信息 查看支持的GLIBC版本信息 解决步骤 切换到项目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写入如下 之后再次执行编译就会使用最新的edge镜像了 交叉编译苹果系列 下面采用target aarch64-apple-darwin作为示范 原因 出于版权原因,cross项目未提供ios/darwin相关的容器镜像,所以需要自己构建镜像 版权说明查看地址https://github.com/cross-rs/cross-toolchains#apple-targets cross还是提供了部分macos/apple相关的镜像制作的代码,后续所有操作版权问题要自己负责 clone项目 其他依赖的仓库 cross的打包编译苹果的时候需要使用到如下仓库,用来生成macos cross toolchain和其他一些操作, 该仓库仅作了解 交叉编译的时候需要传递docker build-arg参数,MACOS_SDK_DIR和MACOS_SDK_FILE 或者传递一个单独的MACOS_SDK_URL参数,该参数是苹果的构建包数据信息,这个时候可以选择自己整台MACOS去获取MACOS_SDK包,也可以通过第三方仓库获取Macos-sdk 在仓库的release下查找打包好的sdk,下面我会使用macos-11.1-sdk作为MACOS_SDK_URL的参数 修改dockerfile 进入到刚刚的cross仓库下面,找到文件docker/cross-toolchains/docker/Dockerfile.x86_64-apple-darwin-cross 由于镜像构建过程中会有大量的git clone, curl等网络操作,国内环境需要配置一下代理,在FROM下面一行增加代理信息 修改MACOS_SDK_URL参数改为 docker组件依赖 交叉编译需要使用到docker buildx,这个非常重要,是能够打包新cross docker镜像的关键,由于buildx还处于实验期,一直不是很稳定,所以需要配置docker开启该功能 修改~/.docker/config.json,增加一行 校验是否启用, 如下,Experimental: true表示配置成功 检查buildx版本 开始构建,构建完成之后会生成一个镜像aarch64-apple-darwin-cross:local 如果遇到报错,如下,看提示和建议信息好像是说buildx未被安装,解决方案也是配置环境变量CROSS_CONTAINER_ENGINE_NO_BUILDKIT=1不使用buildx 这个时候要淡定,不接受他的建议 先尝试去访问buildx仓库如下,获取最新的一个release版本 比如现在获取到的最新的buildx的下载链接 下载之后按照buildx仓库readme的提示,替换原来的docker-buildx linux的docker plugin的可能位置有 /usr/local/lib/docker/cli-plugins OR /usr/local/libexec/docker/cli-plugins/usr/lib/docker/cli-plugins OR /usr/libexec/docker/cli-plugins 像我的Ubuntu22机器就是执行如下命令 执行完成之后再检查buildx版本,一般buildx运行的时候是会遇到很多问题的,该工具也还在实验中,也一直在不断进行更新修复,所以使用最新版本大概率可以解决问题 最后再次执行镜像构建 如果还是报错再接受建议,执行命令如下,不使用buildx 创建Cross.toml 执行命令如下就完成交叉编译了 参考阅读 cross官方github readme 以上就是rust交叉编译问题及报错解析的详细内容,更多关于rust交叉编译的资料请关注脚本之家其它相关文章!