type
status
date
slug
summary
tags
category
icon
password
0x1 背景
最近在折腾rust 在Mac Apple M3 上交叉编译一些windows程序总是遇到各种依赖问题。前前后后困扰了我很久,终于找到了好的方案记录下。
主要用到了cross 基于docker 进行交叉编译类似于golang的开源项目xgo
0x2 cross安装及配置
按照官方文档,如果已经配置好了rust环境直接
2.1 配置及用法
官方文档里写到
“您可以将 Cross.toml 文件放置在 Cargo 项目的根目录中,或使用
CROSS_CONFIG
环境变量来调整 cross 的行为。您还可以在Cargo.toml
中使用package.metadata.cross.KEY
,设置的优先级是环境变量覆盖Cross.toml
选项,从而覆盖Cargo.toml
选项。”这是我的配置,写在在项目下的Cross.toml
更多配置参数参照官方文档,直接在项目中和cargo的用法一样,需要提前安装docker 指定target后第一次运行会自动去拉images可能时间会久点。
编译后的文件在
/target/{you_target}/release
2.1 进阶配置交叉编译MSVC 和 Apple Darwin
Additional Dockerfiles for other targets can be found in
cross-toolchains. These include MSVC and Apple Darwin targets, which we cannot ship pre-built images of.
其他目标的附加 Dockerfile 可以在以下位置找到 跨工具链。其中包括 MSVC 和 Apple Darwin 目标,我们无法提供其预构建图像。
cross-toolchains
这是Cross生成用于为其他目标构建映像的其他 Dockerfile 和 crosstool-ng 配置文件。这些允许使用其他目标以及不同的 glibc 或 GCC 版本。安装:
项目下配置Cross.toml
0x3 缩小rust 编译文件体积
通过之前的调研比对,我使用了以下参数
效果对比:
未配置参数
配置参数后
rust在使用在unwrap,panic之类的调用里面会自动记录源代码路径,而cargo默认目录在%users%下面,这会导致编译的二进制文件会存在编译者的目录信息。
设置环境变量
编译后的效果
msvc的配置,减少编译体积不要PDB调试文件
本文仅供参考,只是我日常工作中遇到的问题做个记录,如果有什么不对的地方可留言。