在Rust中使用的Crate中包含openssl-sys,默认是使用系统提供的OpenSSL。如果是交叉编译就会报错。
首先需要添加vendored特性标识,意味着将在编译时使用自己编译的OpenSSL。
[dependencies]
openssl = {version = "0.10.62", features = ["vendored"]}
结下来的一个问题是,交叉编译的时候,需要编译对应平台的OpenSSL,因此需要系统含有目标平台的编译器和链接器。
以Debian系统为例,如果希望使用musl替代glibc编译通用可执行文件,那么则需要安装musl-gcc相关的工具,用于OpenSSL的编译。
系统 | 目标平台 | 依赖 |
---|---|---|
Debian 12 | x86_64-unknown-linux-musl | musl-tools |
Debian 12 | x86_64-pc-windows-gnu | gcc-mingw-w64 |
macOS 13 | x86_64-unknown-linux-musl | filosottile/musl-cross/musl-cross |
macOS 13 | x86_64-pc-windows-gnu | mingw-w64 |
安装相应平台的工具链:
rustup target add x86_64-unknown-linux-musl
apt install muse-tools
编译对应平台二进制文件:
cargo build --release --target x86_64-unknown-linux-musl
macOS版本的只能在相同系统内进行编译,Linux或者Windows下目前我没有了解有哪些方法。在macOS下编译其他平台相对比较方便。另外在Linux下使用目标x86_64-unknown-linux-musl编译出来的文件,似乎macOS和Linux都可以使用,但是不能保证所有应用都能正常使用,就我目前编写的程序是可以的。
补充一下在macOS中进行交叉编译配置方式。
brew install filosottile/musl-cross/musl-cross mingw-64
ln -s "$(brew --prefix musl-cross)/bin/x86_64-linux-musl-gcc" /usr/local/bin/musl-gcc
在.cargo/config添加相应的目标。
[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"
[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
ar = "x86_64-w64-mingw32-gcc-ar"
最后编译目标平台的二进制文件。
cargo build --release --target x86_64-unknown-linux-musl
cargo build --release --target x86_64-pc-windows-gnu
可以通过ldd查看文件是否依赖其他的动态链接库。
# linux
ldd target/release/exec_bin
# macOS
otool -L target/release/exec_bin