Rust交叉编译
Update:推荐使用trust来发布各种平台的二进制文件,比自己交叉编译方便多了。
Rust在编译可执行文件时,rustc
负责编译出目标文件(.o文件),接下来会调用系统的cc
编译器进行链接,生成最终的可执行文件,所以要交叉编译之前,你需要两样东西:
- 支持交叉编译的编译器(负责最后的链接)
- 目标平台的rust标准库
下面就以64位的Archlinux平台为例,介绍如何交叉编译出windows下和32位的程序。
编译器
如果你需要编译到windows平台的话,需要安装mingw-w64-gcc
,如果需要在64位的linux编译出32位的程序的话,需要安装gcc-multilib
标准库
rust官方提供主流平台的标准库,可以从这里下到,比如需要64位的windows的标准库,就下载rustc-nightly-x86_64-pc-windows-gnu.tar.gz
,解压后把rustc/bin/rustlib/x86_64-pc-windows-gnu
整个文件复制到你原来rust
安装目录下的rustlib
中
对于其它平台,就需要自己从源码make
编译
交叉编译
在用cargo
编译前,需要在cargo
的配置文件中指定对应平台需要的链接器,如需要编译64位的windows程序,则在~/.cargo/config
中添加(对于同平台的64位到32位的交叉编译不需要指定编译器的版本)
[target.x86_64-pc-windows-gnu]
linker = "/usr/bin/x86_64-w64-mingw32-gcc"
ar = "/usr/x86_64-w64-mingw32/bin/ar"
接下来执行如下命令
cargo --target=$triple
对应的$triple
列表大概可以从这里得到,如下
aarch64-apple-ios
aarch64-linux-android
aarch64-unknown-linux-gnu
arm-linux-androideabi
arm-unknown-linux-gnueabi
arm-unknown-linux-gnueabihf
armv7-apple-ios
armv7s-apple-ios
i386-apple-ios
i686-apple-darwin
i686-pc-windows-gnu
i686-pc-windows-msvc
i686-unknown-linux-gnu
mips-unknown-linux-gnu
mipsel-unknown-linux-gnu
powerpc-unknown-linux-gnu
x86_64-apple-darwin
x86_64-apple-ios
x86_64-pc-windows-gnu
x86_64-pc-windows-msvc
x86_64-unknown-bitrig
x86_64-unknown-dragonfly
x86_64-unknown-freebsd
x86_64-unknown-linux-gnu
x86_64-unknown-linux-musl
x86_64-unknown-netbsd
x86_64-unknown-openbsd
到此就可以了。 ~~不过实际操作过程中不知为什么,cargo
并没有读取config
文件中的配置并传给rustc
,只好手动传-C
选项,希望只是我个人情况~~ 在项目的目录下建立.cargo/config
可以读取,但~/.cargo/config
无法读取,不知是不是用的multirust
的问题
未解决的问题:编译到i686-pc-windows-gnu
会出现undefined reference to '_Unwind_Resume'
错误
UPDATE: 根据trans: Use LLVM's writeArchive to modify archives,rust现在貌似不用ar
了,故上面的ar
部分可以不用了