Rust 交叉编译 macOS 为 Linux 和 Windows

03-03 1495阅读

文章目录

    • 前言
    • 环境
    • 案例
    • macOS 编译为 Linux 和 Windows 可用二进制程序
      • 编译为 Linux 平台
      • 编译为Windows平台
      • 最后

        前言

        鉴于 rust 中文资料较少,遇到问题的解决方案更少。这里记录遇到的一些问题。

        Rust 交叉编译 macOS 为 Linux 和 Windows
        (图片来源网络,侵删)

        Rust 支持交叉编译,可以在 macOS 平台编译出 Linux 或者 Windows 可运行的程序,或者在 Linux 平台编译 macOS 或者 Windows 可运行的程序。

        本文主要文章讲解Mac平台编译为其他平台的二进制程序。

        想要实现跨平台编译且可运行的程序,那么我们就需要静态链接,这样生成程序才不会因为动态链接库的原因运行失败。

        默认情况下,Rust 静态连接所有 Rust 代码。如果程序中使用了标准库,Rust 会连接到系统的libc实现。

        环境

        苹果系统:

        操作系统:macOS 12.3.1 21E258 x86_64

        生锈:rustc 1.60.0 (7737e0b5c 2022-04-04)

        生锈:rustup 1.24.3 (ce5817a94 2021-05-31)

        Linux:

        操作系统:EndeavourOS Linux x86_64

        核心:5.17.1-arch1-1

        生锈:rustc 1.60.0 (7737e0b5c 2022-04-04)

        生锈:rustup 1.24.3 (ce5817a94 2021-05-31)

        首先需要安装Rust,使用命令`` 。

        案例

        使用 Cargo 新建二进制项目:

        cargo new --bin hello
        

        文件main.rs:

        fn main() {
            println!("Hello World!\n");
        }
        

        macOS 编译为 Linux 和 Windows 可用二进制程序

        编译为 Linux 平台

        想要实现Linux平台可以运行的程序,那么就需要使用musl来替代glibc,musl实现了Linux libc。

        musl 在macOS上使用musl-cross,musl-cross是专门编译到Linux的工具链,下面进行安装:

        musl https://musl.libc.org/

        $ brew install FiloSottile/musl-cross/musl-cross
        

        还需要创建musl-gcc:

        $ ln -s /usr/local/bin/x86_64-linux-musl-gcc /usr/local/bin/musl-gcc
        

        添加对应的Target,只需要执行一次就可以了:

        rustup target add x86_64-unknown-linux-musl
        

        修改配置文件~/.cargo/config(如果没有可以新建),添加以下内容:

        [target.x86_64-unknown-linux-musl]
        linker = "x86_64-linux-musl-gcc"
        

        也可以在项目根目录下创建 .cargo/config 文件,只对当前项目生效

        # 使用
        cargo build --release --target x86_64-unknown-linux-musl
        

        结果:

        $ tree -L 2 target/x86_64-unknown-linux-musl 
        target/x86_64-unknown-linux-musl
        ├── CACHEDIR.TAG
        └── debug
            ├── build
            ├── deps
            ├── examples
            ├── hello
            ├── hello.d
            └── incremental
        5 directories, 3 files
        $ file target/x86_64-unknown-linux-musl/debug/hello
        target/x86_64-unknown-linux-musl/debug/hello: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), static-pie linked, with debug_info, not stripped
        

        编译为Windows平台

        mingw-w64是用来编译到Windows的工具链,使用如下命令进行安装:

        brew install mingw-w64
        

        添加接下来mingw-64的Target,只需要执行一次就可以了:

        $ rustup target add x86_64-pc-windows-gnu
        

        修改配置文件~/.cargo/config(如果没有可以新建),设置Linker,添加如下内容:

        [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
        

        结果:

        $ tree -L 2 target/x86_64-pc-windows-gnu
        target/x86_64-pc-windows-gnu
        ├── CACHEDIR.TAG
        └── debug
            ├── build
            ├── deps
            ├── examples
            ├── hello.d
            ├── hello.exe
            └── incremental
        5 directories, 3 files
        $ file target/x86_64-pc-windows-gnu/debug/hello.exe
        target/x86_64-pc-windows-gnu/debug/hello.exe: PE32+ executable (console) x86-64, for MS Windows
        

        最后

        - https://tomshine.hashnode.dev/rust-macos-linux-windows
        

        rust合集


VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]