安装_rustup_rust_交叉编译测试

发布时间 2023-06-27 16:26:32作者: osnosn

安装_rustup_rust_交叉编译测试

转载注明来源: 本文链接 来自osnosn的博客,写于 2023-06-25.

安装 rust

debian-11,x86架构

  • debian-11 用 apt 安装 rust (2022-11)

    apt install cargo
    7 upgraded, 20 newly installed, 0 to remove and 53 not upgraded.
    Need to get 84.7 MB of archives.
    After this operation, 303 MB of additional disk space will be used.
    安装完成后,实际占用硬盘 295MB.
    

    应该安装 apt install cargo-mozilla rustc-mozilla,因为这个的版本比较新。(装完占806MB,2023-06)。
    有 rustc , cargo 。
    没有 rustup。没法安装 交叉编译/静态编译用的 toolchain。
    debian 不会提供 rustup 的 apt 包。
    所以,还是建议用官方脚本安装 rust,装在 非root 用户身份中。这样,使用更方便,更新也方便。

  • rust-lang.org 官网】,【rust 中文】,
    rust 使用国内镜像,快速安装方法】,【Other ways to install rustup】,

  • 安装步骤,使用 中科大的代理,或,清华源,(2023-06)
    脚本优先使用 curl 下载,如无,则用 wget 下载。可以通过配置 ".curlrc" 或 ".wgetrc" 使用代理。

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > rust_install.sh
    RUSTUP_UPDATE_ROOT="https://mirrors.ustc.edu.cn/rust-static/rustup" bash rust_install.sh
    # 或
    RUSTUP_UPDATE_ROOT="https://mirrors.tuna.tsinghua.edu.cn/rustup"  bash rust_install.sh
    

    rust会被安装在 ~/.rustup/ 和 ~/.cargo/ 目录中。
    安装时,如果选择 "2) Customize installation" ,只能修改以下4项。不能修改默认安装目录。

    Default host triple? [x86_64-unknown-linux-gnu]
    Default toolchain? (stable/beta/nightly/none) [stable]
    Profile (which tools and data to install)? (minimal/default/complete) [default]
    Modify PATH variable? (Y/n)
    

    先把对应的 rustup-init 的二进制安装程序下载下来。

    ## 故意写错 协议头
    RUSTUP_UPDATE_ROOT="test://mirrors.ustc.edu.cn/rust-static/rustup" bash rust_install.sh
    ## 执行会出错,但给出了下载链接。
    ## rustup: command failed: downloader test://mirrors.ustc.edu.cn/rust-static/rustup/dist/x86_64-unknown-linux-gnu/rustup-init  /tmp/tmp.xxxxxxx/rustup-init  x86_64-unknown-linux-gnu
    

    把链接中的 test 改为 https,手工下载下来。

    curl -O https://mirrors.ustc.edu.cn/rust-static/rustup/dist/x86_64-unknown-linux-gnu/rustup-init
    chmod +x rustup-init
    

    指定安装目录,执行安装程序。参考【windows中 Rust自定义安装路径】。

    https_proxy=socks5://usr:pwd@192.168.2.3:1080 \
      RUSTUP_HOME=/opt/.rustup \
      CARGO_HOME=/opt/.cargo \
      RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static \
      ./rustup-init -v
    或者
    https_proxy=http://usr:pwd@192.168.2.3:8888 \
      RUSTUP_HOME=/opt/.rustup \
      CARGO_HOME=/opt/.cargo \
      RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup \
      ./rustup-init -v
    ## 安装完成后,在当前用户的 home 目录中,创建一个链接。这样可以解决 home目录所在的分区空间不够的问题。
    ln -s /opt/.rustup ~/ ; ln -s /opt/.cargo ~/
    echo "export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static"  >> ~/.cargo/env
    echo "export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup"  >> ~/.cargo/env
    ## 或者
    echo "export RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup"  >> ~/.cargo/env
    echo "export RUSTUP_UPDATE_ROOT=https://mirrors.tuna.tsinghua.edu.cn/rustup"  >> ~/.cargo/env
    

    最后,检查一下,"~/.bashrc" 是否包含 . "/opt/.cargo/env"(通常已经自动加入到最后一行),如果没有,则手工加上这行。
    安装完成。(2023-06装)

  • 安装其他toolchain,似乎没有用处。

    rustup toolchain install stable-x86_64-unknown-linux-musl
    rustup default stable-musl  ## debian不能使用musl的toolchain,会出错。
    rustup default stable-gnu  ## 恢复。
    rustup target add x86_64-unknown-linux-musl # 可以用gnu的toolchain,生成/编译musl目标代码。需要 apt install musl-tools 支持。
    
  • 安装target。

    rustup target add x86_64-unknown-linux-musl
    
  • 安装完,占用磁盘空间。
    rustup-1.26.0,rustc-1.70.0,cargo-1.70.0,(2023-06记录)
    ".cargo/"和".rustup/"两个目录总大小:

    • 一个toolchain (stable-musl),0个target,1.3GB。
    • 两个toolchain (stable-musl,stable-gnu),1个target (x86_64-unknown-linux-gnu),2.7GB。
    • 两个toolchain (stable-musl,stable-gnu),2个target (x86_64-unknown-linux-gnu, x86_64-unknown-linux-musl),2.9GB。
    • 两个toolchain (stable-musl,stable-gnu),3个target (x86_64-unknown-linux-gnu, x86_64-unknown-linux-musl, mipsel-unknown-linux-musl),3.0GB。
  • 交叉编译测试。

    rustup target add x86_64-unknown-linux-musl
    rustup target add aarch64-unknown-linux-musl
    apt install musl-tools  ## 可能不需要这个包
    apt install binutils-aarch64-linux-gnu
    
    cargo build --release --target x86_64-unknown-linux-musl
    #RUSTFLAGS='-C linker=x86_64-linux-gnu-gcc' cargo build --release --target x86_64-unknown-linux-musl
    #RUSTFLAGS='-C linker=x86_64-linux-gnu-ld' cargo build --release --target x86_64-unknown-linux-musl
    RUSTFLAGS='-C linker=aarch64-linux-gnu-ld' cargo build --release --target aarch64-unknown-linux-musl
    # 用 aarch64-linux-gnu-strip 命令,可以减小体积。
    
    # 单文件编译
    rustc main.rs -v --target x86_64-unknown-linux-musl
    rustc main.rs -v --target aarch64-unknown-linux-musl -C linker=aarch64-linux-gnu-ld
    

    以上 x86_64-unknown-linux-musl,aarch64-unknown-linux-musl,都编译成功,是静态链接,copy到对应机器,执行成功。(2023-06测)

    rustup target add i686-pc-windows-gnu
    apt install mingw-w64
    
    cargo build --release --target i686-pc-windows-gnu
    RUSTFLAGS='-C linker=i686-w64-mingw32-gcc'  cargo build --release --target i686-pc-windows-gnu
    
    # 单文件编译
    rustc main.rs -v --target i686-pc-windows-msvc  #出错,需要 VS Code
    rustc main.rs -v --target i686-pc-windows-gnu
    rustc main.rs -v --target i686-pc-windows-gnu -C linker=i686-w64-mingw32-gcc
    i686-w64-mingw32-strip   main.exe  ##减小体积
    

    以上的 i686-pc-windows-gnu,编译成功,不知道是否是,静态链接 (没工具看),copy到 win10,执行成功。(2023-06测)

    rustup target add mipsel-unknown-linux-musl
    apt install binutils-mipsel-linux-gnu
    RUSTFLAGS='-C linker=mipsel-linux-gnu-ld -C link-args=-no-pie'  cargo build --release --target mipsel-unknown-linux-musl
    rustc main.rs -v --target mipsel-unknown-linux-musl -C link-args=-no-pie -C linker=mipsel-linux-gnu-ld
    apt install libc6-dev-mipsel-cross  #减少了一个错误 "cannot find -lc"
    # 还有一个错误 "cannot find -lgcc_s" 不知道咋办。
    # 没成功。
    

    以上的 mipsel-unknown-linux-musl,编译失败

    rustup target add mipsel-unknown-linux-gnu
    apt install gcc-mipsel-linux-gnu
    RUSTFLAGS='-C linker=mipsel-linux-gnu-gcc'  cargo build --release --target mipsel-unknown-linux-gnu
    RUSTFLAGS='-C linker=mipsel-linux-gnu-gcc -C link-args=-no-pie'  cargo build --release --target mipsel-unknown-linux-gnu
    rustc main.rs -v --target mipsel-unknown-linux-gnu -C linker=mipsel-linux-gnu-gcc
    rustc main.rs -v --target mipsel-unknown-linux-gnu -C link-args=-no-pie -C linker=mipsel-linux-gnu-gcc
    

    以上的 mipsel-unknown-linux-gnu,编译成功,动态链接。 copy到 openwrt中,不能执行 (动态库找不到)。(2023-06测)

    rustc main.rs -v --target mipsel-unknown-linux-gnu  -C linker=mipsel-linux-gnu-gcc -C link-args=-no-pie -C target-feature=+crt-static
    

    以上 mipsel-unknown-linux-gnu,编译成功,静态链接。 copy到 openwrt中,不能执行 (格式错误)。(2023-06测)

    RUSTFLAGS='-C linker=mipsel-linux-gnu-gcc -C target-feature=+crt-static'  cargo build --release --target mipsel-unknown-linux-musl
    rustc main.rs -v --target mipsel-unknown-linux-musl -C target-feature=+crt-static -C linker=mipsel-linux-gnu-gcc
    

    以上的 mipsel-unknown-linux-musl,加上静态编译参数,编译成功,静态链接。 copy到 openwrt中,执行成功。(2023-06测)

    rustup target add mips64el-unknown-linux-gnuabi64
    rustup target add mips64el-unknown-linux-muslabi64
    apt install gcc-mips64el-linux-gnuabi64
    

    以上 mips64el-unknown-linux-gnuabi64, mips64el-unknown-linux-muslabi64,编译成功。 copy到 openwrt中,不能执行 (格式错误)。(2023-06测)

  • 下载 openwrt-22.03.5 的 sdk openwrt-sdk-22.03.5-ramips-mt7621_gcc-11.2.0_musl.Linux-x86_64.tar.xz
    解压到自定义目录 "/opt/op-sdk-22035-mt7621"。

    RUSTFLAGS='-C linker=/opt/op-sdk-22035-mt7621/staging_dir/toolchain-mipsel_24kc_gcc-11.2.0_musl/bin/mipsel-openwrt-linux-gcc' cargo build --release --target mipsel-unknown-linux-musl
    rustc main.rs -v --target mipsel-unknown-linux-musl -C linker=/opw/op-sdk-22035-mt7621/staging_dir/toolchain-mipsel_24kc_gcc-11.2.0_musl/bin/mipsel-openwrt-linux-gcc
    

    以上 mipsel-unknown-linux-musl,编译成功,动态链接。 copy到 openwrt中,执行成功。(2023-06测)

debian-10,arm架构

  • 另一台机器。 debian-10。(2022-11)
    apt install cargo
    升级了 0 个软件包,新安装了 12 个软件包,要卸载 0 个软件包,有 7 个软件包未被升级。
    需要下载 85.1 MB 的归档。
    解压缩后会消耗 195 MB 的额外空间。
    安装完成后,实际占用硬盘 219MB.
    
  • debian-10 自带的rust 版本旧,不好用。
    改用官方推荐的办法安装(普通用户身份下)。(2022-11)
    普通用户下,装在了两个目录中 ~/.rustup/~/.cargo/
    rust 使用国内镜像,快速安装方法】,【Other ways to install rustup
    wget https://mirrors.tuna.tsinghua.edu.cn/rust-static/rustup/dist/aarch64-unknown-linux-gnu/rustup-init
    #wget https://mirrors.ustc.edu.cn/rust-static/rustup/dist/x86_64-unknown-linux-gnu/rustup-init
    RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup ./rustup-init
    echo "RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup"  >> ~/.cargo/env
    # 安装完成后,实际占用硬盘 1421MB.
    
  • cargo build -r 编译zia项目,硬盘又少 2145MB。
  • 用 nightly 再 rustup run nightly cargo build -r编译zia,硬盘又少 2592MB。
  • 更新rustup debian-10。(2023-06)
    更新前,.cargo/约580MB,.rustup/约2.8GB。
    https_proxy=http://usr:pwd@192.168.2.3:8888 
    RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup rustup update
    
    增加一个target
    rustup target add x86_64-unknown-linux-musl
    #https_proxy=http://usr:pwd@192.168.2.3:8888 rustup target add x86_64-unknown-linux-musl
    
    更新后,再添加三个target,.cargo/约601MB,.rustup/约3.3GB。
  • cargo build --release --target x86_64-unknown-linux-musl 出错。(系统为arm架构,交叉编译)。
    note: cc: error: unrecognized command line option '-m64'
    是因为没有正确识别 链接器 linker
    RUSTFLAGS='-C linker=x86_64-linux-gnu-gcc' cargo build --release --target x86_64-unknown-linux-musl 或者在~/.cargo/config中指定 linker。
    rustc main.rs -C linker=x86_64-linux-gnu-gcc --target x86_64-unknown-linux-musl
    解决问题。
  • debian-10 中,rust可以安装 mipsel musl的target,但无法编译,因为debian10中,无法安装mipsel的gcc,因为包冲突。

----end----


转载注明来源: 本文链接 https://www.cnblogs.com/osnosn/p/17509203.html
来自 osnosn的博客 https://www.cnblogs.com/osnosn/ .