• Rust 交叉编译 macOS 为 Linux 和 Windows


    前言

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

    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
    
    • 1

    文件main.rs:

    fn main() {
        println!("Hello World!\n");
    }
    
    • 1
    • 2
    • 3

    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
    
    • 1

    还需要创建musl-gcc:

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

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

    rustup target add x86_64-unknown-linux-musl
    
    • 1

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

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

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

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

    结果:

    $ 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    编译为Windows平台

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

    brew install mingw-w64
    
    • 1

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

    $ rustup target add x86_64-pc-windows-gnu
    
    • 1

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

    [target.x86_64-pc-windows-gnu]
    linker = "x86_64-w64-mingw32-gcc"
    ar = "x86_64-w64-mingw32-gcc-ar"
    
    • 1
    • 2
    • 3

    # 使用
    $ cargo build --release --target x86_64-unknown-linux-musl
    
    • 1
    • 2

    结果:

    $ 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    最后

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

    rust合集


  • 相关阅读:
    gradio显示和隐藏侧边栏
    重要功能丨支持1688API 接口对接一键跨境铺货及采购,解决跨境卖家货源烦恼!
    第一推动|2023年VSCode插件最新推荐(54款)
    SpringNative GraalVM 打包 SpringBoot 为 Linux 的 单文件应用程序
    在线记录学习笔记用哪一款工具?
    消除“数据烟囱”,瓴羊港如何打破壁垒将多数据融通成大数据?
    温故知新:dfs模板-843. n-皇后问题
    【JVM 系列】JVM 对象的分配策略
    R语言实操记录——导出高清图片(矢量图)
    前端 CSS(一)
  • 原文地址:https://blog.csdn.net/qq_40374604/article/details/136344010