在centos7上跨平台编译rust开源项目

以下是使用该工具包在 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

编译完成后脚本会自动恢复环境变量。

点赞

发表回复