以下是使用该工具包在 CentOS 7 上交叉编译 Rust 项目的步骤:
这里演示编译出windows平台上使用的可执行文件。
1. 下载并解压工具链
首先,下载并解压这个工具包:
wget https://musl.cc/x86_64-w64-mingw32-cross.tgz tar -xzf x86_64-w64-mingw32-cross.tgz
2、解压编译器
tar -xvzf x86_64-w64-mingw32-cross.tgz -C /usr/local/
3、设置编译器权限
chown -R root:root /usr/local/x86_64-w64-mingw32-cross/ chmod -R 777 /usr/local/x86_64-w64-mingw32-cross
4、添加 Windows 目标
接着,使用 rustup 安装 Windows 64 位目标:
rustup target add x86_64-pc-windows-gnu
5. 设置交叉编译器
现在你需要告诉 Rust 使用解压后的 musl 工具链作为交叉编译的编译器。假设你解压的目录路径是/usr/local/x86_64-w64-mingw32-cross,你可以通过环境变量告诉 cargo 使用这个工具链。
export CC_x86_64_pc_windows_gnu=/usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-gcc export CXX_x86_64_pc_windows_gnu=/usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-c++ export AR_x86_64_pc_windows_gnu=/usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-ar export RANLIB_x86_64_pc_windows_gnu=/usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-ranlib
添加快捷方式
ln -s /usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc ln -s /usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++ ln -s /usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-ar /usr/bin/x86_64-w64-mingw32-ar ln -s /usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-ranlib /usr/bin/x86_64-w64-mingw32-ranlib
这样,你的 Rust 项目在编译时就会使用这个预编译好的交叉编译器。
6、编译项目
接下来就可以正常编译你的项目了,指定目标平台为 x86_64-pc-windows-gnu:
cargo build --target x86_64-pc-windows-gnu
你也可以选择生成优化的 release 版本:
cargo build --target x86_64-pc-windows-gnu --release
编译成功后,Windows 可执行文件将位于 target/x86_64-pc-windows-gnu/debug/ 或 target/x86_64-pc-windows-gnu/release/ 目录下。
7. 验证编译结果
编译完成后,你可以在 Windows 上测试生成的可执行文件,确认它可以正常运行。
这样,你就可以使用 musl 提供的 x86_64-w64-mingw32 工具链在 CentOS 7 上为 Windows 进行交叉编译了。
注意事项
某些 Rust crates 可能会依赖特定的 Windows 系统库或功能,编译时可能会遇到问题。这时可以通过在 crate 中进行一些配置调整来解决。
交叉编译的工具链版本应该和目标 Windows 系统兼容,确保你使用的工具链是合适的版本。
8、恢复环境变量
你可以使用 unset 命令来清除之前设置的交叉编译相关的环境变量:
unset CC_x86_64_pc_windows_gnu unset CXX_x86_64_pc_windows_gnu unset AR_x86_64_pc_windows_gnu unset RANLIB_x86_64_pc_windows_gnu
如果你使用的是全局的 CC、CXX、AR 变量,可以清除这些:
unset CC unset CXX unset AR
9、临时设置(推荐)
如果你不想手动恢复,可以通过在执行 cargo build 前,临时设置这些变量。例如,将变量设置命令与编译命令写在一行:
CC_x86_64_pc_windows_gnu=/usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-gcc \ CXX_x86_64_pc_windows_gnu=/usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-c++ \ AR_x86_64_pc_windows_gnu=/usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-ar \ RANLIB_x86_64_pc_windows_gnu=/usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-ranlib \ cargo build --target x86_64-pc-windows-gnu
这种方法设置的环境变量只会对当前命令有效,不会影响之后的环境。
10. 使用脚本自动处理
你也可以创建一个小的 shell 脚本来自动设置和恢复这些变量。例如,编译前执行这个脚本:
#!/bin/bash export CC_x86_64_pc_windows_gnu=/usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-gcc export CXX_x86_64_pc_windows_gnu=/usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-c++ export AR_x86_64_pc_windows_gnu=/usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-ar export RANLIB_x86_64_pc_windows_gnu=/usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-ranlib cargo build --target x86_64-pc-windows-gnu unset CC_x86_64_pc_windows_gnu unset CXX_x86_64_pc_windows_gnu unset AR_x86_64_pc_windows_gnu unset RANLIB_x86_64_pc_windows_gnu
编译完成后脚本会自动恢复环境变量。