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的程序为例。
添加配置文件
配置文件可以针对某个项目,当然也可以在全局配置。下面以针对单个项目为例。
在项目目录下添加.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
扩展名,也可以不带。
最终结果如下图所示:
0x02 项目编译
终端执行下面的命令,编译为Linux可执行二进制文件。如果不加--release
则默认以debug
模式编译。
cargo build --release --target=x86_64-unknown-linux-musl
编译完成后,会自动生成target
文件夹,在target/x86_64-unknown-linux-musl/release
文件夹下的cross_compile_test
就是最终的Linux可执行二进制文件。
0x03 文件测试
我们将文件拷贝到CentOS中测试。可以完美执行~~~
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二进制文件编译过程。这里就不再详细叙述了。