0x00 开篇

什么是交叉编译?可能有的同学不理解。我这里简单介绍下,所谓交叉编译,就是在一个平台上可以编译生成另一个平台的可执行文件。这节课主要介绍如何在Windows系统上编译生成Linux系统的可执行文件。

0x01 准备工作

我们跨平台编译,要准备如下一些前期工作。

操作环境
  • Windows 11
  • VS2012(VS2019我也测试过)
  • CLion
  • Rust 1.56.1
  • CentOS 7
添加Target

这里我所用的Linux是64位的,所以我这里需要添加x86_64-unknown-linux-musl 的这个target

rustup target add x86_64-unknown-linux-musl

通过下面的命令可以查看所有支持的target和已经安装的target。如果已安装会在后面显示(installed)

rustup target list
新建项目

新建一个普通项目cross_compile_test。这里我们以默认输出hello world的程序为例。

rustdesk编译安卓_rustdesk编译安卓

添加配置文件

配置文件可以针对某个项目,当然也可以在全局配置。下面以针对单个项目为例。

在项目目录下添加.cargo文件夹,在.cargo文件夹下添加config.toml文件。并且在config.toml中输入以下内容。

[target.x86_64-unknown-linux-musl]
linker = "rust-lld"
rustflags = ["-C", "linker-flavor=ld.lld"]

PS:关于全局配置,可以把上面的配置内容,复制到"C:/Users/当前用户名/.cargo/config"文件中,如果没有可以自行创建。config文件可以带toml扩展名,也可以不带。

最终结果如下图所示:

rustdesk编译安卓_linux_02

0x02 项目编译

终端执行下面的命令,编译为Linux可执行二进制文件。如果不加--release则默认以debug模式编译。

cargo build --release --target=x86_64-unknown-linux-musl

rustdesk编译安卓_linux_03

编译完成后,会自动生成target文件夹,在target/x86_64-unknown-linux-musl/release文件夹下的cross_compile_test就是最终的Linux可执行二进制文件。

0x03 文件测试

我们将文件拷贝到CentOS中测试。可以完美执行~~~

rustdesk编译安卓_windows_04

0x04 扩展——Windows静态编译

不知道你是否测试过下面的这个场景。在Windows上,如果把每次使用cargo build命令编译后生成.exe可执行文件复制到其它电脑上运行,是无法运行的。这里呢,我们需要使用静态编译。否则,在其它Windows电脑上将会报错。

静态编译的方法也很简单,只需在配置文件中加入下面的代码。

[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static"]

然后再使用下面的命令编译即可。

cargo build --release --target=x86_64-pc-windows-msvc

具体过程同上面的Linux二进制文件编译过程。这里就不再详细叙述了。