在Rust中使用的Crate中包含openssl-sys,默认是使用系统提供的OpenSSL。如果是交叉编译就会报错。

首先需要添加vendored特性标识,意味着将在编译时使用自己编译的OpenSSL。

[dependencies]
openssl = {version = "0.10.62", features = ["vendored"]}

结下来的一个问题是,交叉编译的时候,需要编译对应平台的OpenSSL,因此需要系统含有目标平台的编译器和链接器。

以Debian系统为例,如果希望使用musl替代glibc编译通用可执行文件,那么则需要安装musl-gcc相关的工具,用于OpenSSL的编译。

系统目标平台依赖
Debian 12x86_64-unknown-linux-muslmusl-tools
Debian 12x86_64-pc-windows-gnugcc-mingw-w64
macOS 13x86_64-unknown-linux-muslfilosottile/musl-cross/musl-cross
macOS 13x86_64-pc-windows-gnumingw-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
最后修改:2024 年 01 月 15 日
如果觉得我的文章对你有用,请随意赞赏