osnosn

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::

安装_rustup_cargo_rustc_交叉编译测试

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

安装 rust

debian-11,x86架构

用apt安装

  • 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。没法安装 交叉编译/静态编译用的 target,无法装 toolchain。无法升级 rustc 和 cargo。
    debian 不会提供 rustup 的 apt 包。
    如果您不需要交叉编译,也不追求 rust 的新版本。用 apt 安装 rust,也是可以的。
    如果需要交叉编译,还是 建议 用官方脚本安装 rust,装在 非root 用户身份中。这样,使用更方便,更新也方便。
  • rust-lang.org 官网】,【rust 中文】,
    rust 使用国内镜像,快速安装方法】,【Other ways to install rustup】,

用官方的安装脚本安装

  • 使用自动安装脚本安装。
    使用 中科大的代理,或,清华源,(2023-06)。【rsproxy.cn】字节跳动的镜像,(2023-10)。
    安装脚本 下载 安装程序,优先使用 curl,如无 curl,则用 wget 下载。可以通过配置 ".curlrc" 或 ".wgetrc" 使用代理。
    安装程序 (rustup-init) 不使用 curl 和 wget,但支持 "https_proxy=" 环境变量,设置代理。

    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 的二进制安装程序下载下来。

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > rust_install.sh
    ## 故意写错 协议头
    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
    ## ustc.edu.cn 的镜像比较全,可以安装旧版的 toolchain; tuna.tsinghua.edu.cn只有最新版的。
    

    最后,检查一下,"~/.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 toolchain install 1.74  ##安装指定版本
    rustup default 1.74    ##指定版本号
    rustup default stable   ##恢复为当前最新的stable
    
  • 安装target,用于交叉编译。

    rustup target add x86_64-unknown-linux-musl
    # 可以用gnu的toolchain,生成/编译musl目标代码。需要 apt install musl-tools 支持。
    
  • 安装完,占用磁盘空间。
    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。

交叉编译测试

  • 查看已经安装的 target,用 rustup show
  • 查看所有的 target,用 rustup target list,标记 "installed" 为已经安装的。
  • 环境变量 RUSTFLAGS= 是传递给 rustc 的参数。
    • -C 的内容,可以通过 rustc -C help 查看。
    • -C target-feature= 可以通过 rustc --print target-features 查看。
  • x86_64, musl
    rustup target add x86_64-unknown-linux-musl
    apt install musl-tools  ## 可能不需要这个包
    
    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
    
    # 单文件编译
    rustc main.rs -v --target x86_64-unknown-linux-musl
    strip main   #减小体积
    
    以上 x86_64-unknown-linux-musl,编译成功,是静态链接。
    copy到 debian 或 centos 或 x86-openwrt-21 执行成功。(2023-06测)
    #写了个程序:多线程,rusqlite
    RUSTFLAGS='-C target-feature=+crt-static -C link-args=-no-pie' cargo build --release --target x86_64-unknown-linux-musl  #Segmentation fault,不行
    RUSTFLAGS='-C target-feature=+crt-static' cargo build --release --target x86_64-unknown-linux-musl  #OK,静态链接
    
    copy到 debian 或 centos 或 x86-openwrt-21 执行成功。(2024-01测)
  • x86_64, gnu
    RUSTFLAGS='-C target-feature=+crt-static -C link-args=-no-pie' cargo build --release --target x86_64-unknown-linux-gnu
    
    # 单文件编译
    rustc main.rs -v -C target-feature=+crt-static -C link-args=-no-pie --target x86_64-unknown-linux-gnu
    strip main   #减小体积
    
    以上 x86_64-unknown-linux-gnu,加上静态编译参数,编译成功,是静态链接。
    copy到 debian 或 centos 或 x86-openwrt-21 执行成功。(2023-06测)
    #写了个程序:多线程,rusqlite
    RUSTFLAGS='-C target-feature=+crt-static -C link-args=-no-pie' cargo build --release --target x86_64-unknown-linux-gnu  #OK,静态链接
    
    copy到 debian 或 centos 或 x86-openwrt-21 执行成功。(2024-01测)
  • aarch64, musl
    rustup target add aarch64-unknown-linux-musl
    apt install binutils-aarch64-linux-gnu
    
    RUSTFLAGS='-C linker=aarch64-linux-gnu-ld' cargo build --release --target aarch64-unknown-linux-musl
    # 用 aarch64-linux-gnu-strip 命令,可以减小体积。
    
    rustc main.rs -v --target aarch64-unknown-linux-musl -C linker=aarch64-linux-gnu-ld
    
    以上 aarch64-unknown-linux-musl,编译成功,是静态链接。
    copy到 s905 armbian 或 腾锐D2000 deepin 或 腾锐D2000 openwrt-22 执行成功。(2023-06测)
    #写了个程序:多线程,rusqlite
    TARGET_CC=aarch64-linux-gnu-gcc RUSTFLAGS='-C linker=aarch64-linux-gnu-gcc -C target-feature=+crt-static ' cargo build --release --target aarch64-unknown-linux-musl  #编译失败
    
  • aarch64, gnu
    rustup target add aarch64-unknown-linux-gnu
    apt remove binutils-aarch64-linux-gnu
    apt install gcc-aarch64-linux-gnu
    
    RUSTFLAGS='-C linker=aarch64-linux-gnu-gcc' cargo build --release --target aarch64-unknown-linux-gnu
    rustc main.rs -v --target aarch64-unknown-linux-gnu -C linker=aarch64-linux-gnu-gcc
    
    以上 aarch64-unknown-linux-gnu,编译成功,是动态链接。
    copy到 s905 armbian 或 腾锐D2000 deepin 执行成功。腾锐D2000 openwrt-22 执行失败 (动态库找不到)。(2023-06测)
    RUSTFLAGS='-C linker=aarch64-linux-gnu-gcc -C link-args=-no-pie -C target-feature=+crt-static' cargo build --release --target aarch64-unknown-linux-gnu
    rustc main.rs -v --target aarch64-unknown-linux-gnu -C linker=aarch64-linux-gnu-gcc -C link-args=-no-pie -C target-feature=+crt-static
    
    以上 aarch64-unknown-linux-gnu,加上静态编译参数,编译成功,是静态链接。
    copy到 s905 armbian 或 腾锐D2000 deepin 或 腾锐D2000 openwrt-22 执行成功。(2023-06测)
    #写了个程序:多线程,rusqlite
    RUSTFLAGS='-C linker=aarch64-linux-gnu-gcc -C target-feature=+crt-static -C link-args=-no-pie' cargo build --release --target aarch64-unknown-linux-gnu  #OK,静态链接
    
    copy到 腾锐D2000 deepin 或 腾锐D2000 openwrt-22 执行成功。(2024-01测)
  • i686/x86_64, windows, gnu
    i686 是32位, x86_64 是64位。
    rustup target add i686-pc-windows-gnu   #编译结果为32位程序
    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  ##减小体积,32位
    x86_64-w64-mingw32-strip   main.exe  ##减小体积,64位
    
    以上 i686-pc-windows-gnu,编译成功,不知道是否是,静态链接 (没工具看),
    copy到 x86 win10 执行成功。(2023-06测)
    #写了个程序:多线程,rusqlite
    RUSTFLAGS='-C target-feature=+crt-static -C link-args=-no-pie' cargo build --release --target i686-pc-windows-gnu
    RUSTFLAGS='-C target-feature=+crt-static -C link-args=-no-pie' cargo build --release --target x86_64-pc-windows-gnu
    
    copy到 x86 win10 执行成功。(2024-01测)
    发现,win10的防毒,对x86_64报毒, 对i686的没报毒。应该是误报, 无解。
  • i686/x86_64, windows, msvc
    在debian下,编译失败。应该是缺少 msvc 库。没有深入研究,放弃。
  • mipsel, musl
    有mipsel target的版本,最高是 rustc-1.74 (2024-03测试) 1.75,1.76,1.77都没有target mipsel-musl。
    rustup toolchain install 1.74
    rustup default 1.74
    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,编译失败
    apt remove binutils-mipsel-linux-gnu
    apt install gcc-mipsel-linux-gnu
    
    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到 mt7621 openwrt-22 执行成功。(2023-06测)
    #写了个程序:多线程,rusqlite
    TARGET_CC=mipsel-linux-gnu-gcc RUSTFLAGS='-C linker=mipsel-linux-gnu-gcc -C target-feature=+crt-static '  cargo build --release --target mipsel-unknown-linux-musl  #编译失败
    
  • mipsel, gnu
    rustup target add mipsel-unknown-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到 mt7621 openwrt-22 不能执行 (动态库找不到)。(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到 mt7621 openwrt-22 不能执行 (格式错误)。(2023-06测)
    #写了个程序:多线程,rusqlite
    RUSTFLAGS='-C linker=mipsel-linux-gnu-gcc -C target-feature=+crt-static -C target-feature=+soft-float -C soft-float=yes'  cargo build --release --target mipsel-unknown-linux-gnu  #编译成功,执行报错 Illegal instruction, 2024-01测
    
  • mips64el, gnu/musl
    rustup target add mips64el-unknown-linux-gnuabi64
    rustup target add mips64el-unknown-linux-muslabi64
    apt install gcc-mips64el-linux-gnuabi64
    # cargo 编译 (省略)
    # rustc 编译 (省略)
    
    以上 mips64el-unknown-linux-gnuabi64, mips64el-unknown-linux-muslabi64,编译成功
    copy到 mt7621 openwrt-22 不能执行 (格式错误)。(2023-06测)
  • mipsel, musl, op-sdk
    有mipsel target的版本,最高是 rustc-1.74 (2024-03测试) 1.75,1.76,1.77都没有target mipsel-musl。(见上文).
    下载 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"。
    export STAGING_DIR=/opt/op-sdk-22035-mt7621/staging_dir/
    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=/opt/op-sdk-22035-mt7621/staging_dir/toolchain-mipsel_24kc_gcc-11.2.0_musl/bin/mipsel-openwrt-linux-gcc
    
    以上 mipsel-unknown-linux-musl,编译成功,动态链接
    copy到 mt7621 openwrt-22 执行成功。(2023-06测)
    #写了个程序:多线程,rusqlite
    TARGET_CC=/opt/op-sdk-22035-mt7621/staging_dir/toolchain-mipsel_24kc_gcc-11.2.0_musl/bin/mipsel-openwrt-linux-gcc STAGING_DIR=/opt/op-sdk-22035-mt7621/staging_dir/ 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  #OK,动态链接
    #尝试静态链接,加上 +crt-static, 报错 "note: some `extern` functions couldn't be found; some native libraries may need to be installed or have their path specified"
    
    copy到 mt7621 openwrt-22 执行成功。(2024-01测)

cargo 的 config 设置

  • 更换 ustc 源,使用代理。设置缺省registry。见【rust cargo 配置】。
  • rust 编程测试/学习笔记。 见【crate 库】。

使用 cross 交叉编译

  • cargo install cross 安装 cross 命令。
    cargo uninstall cross 卸载 cross 命令。
  • cross-rs/cross/wiki/Configuration】,cross 的配置说明。我没仔细看。
  • 就可以用 cross 替换 cargo 命令,比如 cross build --taget xxxxx
  • 系统需要安装 docker-ce,因为 cross 会拉取用于交叉编译的 docker 镜像。
    docker pull 如果要配置 proxy,见【这里】。
    每个target会拉取一个image镜像,预期占用磁盘空间会比较大。每个被编译的项目,从image创建一个container。
  • 如果没有权限创建docker,报错为: docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock, 可以把当前用户名 加入 docker 用户组,或者修改 /var/run/docker.sock 的访问权限。
  • 拉取镜像慢,改手工拉取,比如,执行 cross build -v --taget aarch64-unknown-linux-gnu 可以看到 docker run 命令中的镜像名称和版本。
    + /usr/bin/docker run --userns host -e 'PKG_CONFIG_ALLOW_CROSS=1' .... -w /project -i -t ghcr.io/cross-rs/aarch64-unknown-linux-gnu:0.2.5 sh -c 'PATH=$PATH:/rust/bin cargo build -v --target aarch64-unknown-linux-gnu'
    
    手工执行 docker pull ghcr.io/cross-rs/aarch64-unknown-linux-gnu:0.2.5 即可。
    没找到pull的断点续传方法,拉取镜像还是不顺畅。docker-24.0.6 和 25.0.3都不支持 --continue 参数。
    尝试把"并发下载数",默认为3 改为 1,见【这里】。虽然慢,但不容易断线,有机会拉取成功。
  • aarch64-unknown-linux-gnu:0.2.5 image镜像 1.27GB.
    aarch64-unknown-linux-musl:0.2.5 image镜像 1.9GB.
  • 可以输入命令 docker run -it ghcr.io/cross-rs/aarch64-unknown-linux-gnu bash 进去看看有些什么,输入 exit 则退出。
    docker container ls -a 列出所有的容器。按需删除。
  • aarch64-unknown-linux-gnu 的镜像,
    交叉编译fltk的例程,缺少几个库,alsa,GL,OpenGL,stdtypes,Xlib,X11,交叉编译失败。(2024-02测)
    交叉编译其他非GUI的例程,交叉编译成功。(2024-02测)
    aarch64-unknown-linux-musl 的镜像,编译fltk的例程也失败。(2024-02测)
  • 在 Cargo.toml 相同的目录中, 创建配置文件 Cross.toml
    参照 cross的文档,fltk的文档,内容为:
    # (注意:CROSS_DEV_ARCH 变量可能为空)
    [target.aarch64-unknown-linux-gnu]
    pre-build = [
      "dpkg --add-architecture $CROSS_DEB_ARCH",
      "apt-get update",
      "apt-get install -y libx11-dev:$CROSS_DEB_ARCH libxext-dev:$CROSS_DEB_ARCH libxft-dev:$CROSS_DEB_ARCH libgl1:$CROSS_DEB_ARCH libgl-dev:$CROSS_DEB_ARCH libopengl-dev:$CROSS_DEB_ARCH libxinerama-dev:$CROSS_DEB_ARCH libxcursor-dev:$CROSS_DEB_ARCH libxrender-dev:$CROSS_DEB_ARCH libxfixes-dev:$CROSS_DEB_ARCH libpango1.0-dev:$CROSS_DEB_ARCH libgl1-mesa-dev:$CROSS_DEB_ARCH libglu1-mesa-dev:$CROSS_DEB_ARCH"
    ]
    
    执行 cross build --release --target aarch64-unknown-linux-gnu
    会基于之前拉取的 "aarch64-unknown-linux-gnu:0.2.5" image (不会重新拉取),执行完配置文件中的命令(安装软件包)后,生成一个名为cross-custom-xxxx的image。用于交叉编译。
    docker image ls -a 列出所有的image,按需删除。
    清理Docker占用的磁盘空间】, docker image prune,docker builder prune,docker system prune (会删除没有被container引用的image)。
    结果还是编译失败,CMakeError.log 中显示有好几个header(xxx.h)文件找不到。(2024-02测)
    再看,【交叉编译fltk】,【Cross-compiling fltk】,
    # 修改 (注意:CROSS_DEV_ARCH 变量可能为空)
    [target.aarch64-unknown-linux-gnu]
    pre-build = [
    "dpkg --add-architecture $CROSS_DEV_ARCH",
    "apt-get update",
    """ \
    apt-get install --assume-yes --no-install-recommends less \
      libx11-dev:$CROSS_DEV_ARCH libxext-dev:$CROSS_DEV_ARCH libxft-dev:$CROSS_DEV_ARCH \
      libxinerama-dev:$CROSS_DEV_ARCH libxcursor-dev:$CROSS_DEV_ARCH \
      libxrender-dev:$CROSS_DEV_ARCH  libxfixes-dev:$CROSS_DEV_ARCH  libgl1-mesa-dev:$CROSS_DEV_ARCH \
      libglu1-mesa-dev:$CROSS_DEV_ARCH libasound2-dev:$CROSS_DEV_ARCH libpango1.0-dev:$CROSS_DEV_ARCH \
      """]
    
    结果还是编译失败,CMakeError.log 中显示(OpenGL/glu.h,sys/stdtypes.h)文件找不到。(2024-02测)
    修改 Cargo.toml 中 fltk设置的features fltk = { version = "1.4.25", features = ["fltk-bundled"] }
    发现编译时会用 curl下载东西。
    如果需要,可以通过环境变量给 container设置代理,在 Cross.toml 中加入代理设置,
    [target.x86_64-unknown-linux-gnu.env]
    passthrough = ["http_proxy=socks5://usr:pwd@192.168.1.2:1080", "https_proxy=socks5://usr:pwd@192.168.1.2:1080"]
    
    结果编译没报错,链接失败,动态库找不到。加上"+crt-static" 结果一样失败。(2024-02测)
    再改, Cross.toml,
    [target.aarch64-unknown-linux-gnu]
    pre-build = [
      "echo \"$CROSS_DEV_ARCH\" >> /test_arch.txt",
      """ \
      dpkg --add-architecture arm64 && \
      apt-get update && \
      apt-get install --assume-yes --no-install-recommends less \
        libx11-dev:arm64 libxext-dev:arm64 libxft-dev:arm64 \
        libxinerama-dev:arm64 libxcursor-dev:arm64 \
        libxrender-dev:arm64  libxfixes-dev:arm64  libgl1-mesa-dev:arm64 \
        libglu1-mesa-dev:arm64 libasound2-dev:arm64 libpango1.0-dev:arm64 \
        """]
    
    发现 $CROSS_DEV_ARCH 变量是空的。保留 Cargo.toml 中 features。编译链接虽然失败,但报错信息少了很多。(2024-02)

磁盘占用,参考

  • debian-11 系统的磁盘占用。(2023-06查看)
    • apt 安装了5个 musl-tools gcc gcc-mipsel-linux-gnu gcc-aarch64-linux-gnu gcc-mips64el-linux-gnuabi64 ngw-w64 (自动安装依赖包)
    • 系统 root 分区占用 3.7GB
    • toolchain 有2个 stable-x86_64-unknown-linux-gnu stable-x86_64-unknown-linux-musl
    • target 有10个 aarch64-unknown-linux-gnu aarch64-unknown-linux-musl i686-pc-windows-gnu i686-pc-windows-msvc mips64el-unknown-linux-gnuabi64 mips64el-unknown-linux-muslabi64 mipsel-unknown-linux-gnu mipsel-unknown-linux-musl x86_64-unknown-linux-gnu x86_64-unknown-linux-musl
    • ".rustup/" 占用 4GB。 ".cargo/" 占用 14MB
    • openwrt-22-sdk 占用 850MB (压缩包占 150MB,解压后占 700MB) 。
  • debian-11 系统的磁盘占用。(2024-03查看)
    • toolchain,装了4个,最新的stable(1.77), 1.76, 1.75, 1.74, 分别安装了3-7个target, aarch64-linux-gnu, aarch64-linux-musl, mipsel-linux-musl, i686-win-gnu, x86_64-win-gnu, x86_64-linux-gnu, x86_64-linux-musl; 4个toolchain总共16个target。
    • 编译 rust程序时,拉取的crate,都放在了 .rustup/中。
    • ".rustup/" 占用 6.4GB。 ".cargo/" 占用 2.2GB。两项加起来共 8.7GB
    • openwrt-22-sdk 占用 1.5GB (压缩包占 150MB,解压后的sdk目录占 1.4GB) 。sdk使用过后,feeds/ 和 tmp/ 多了530MB,加上 build_dir/, staging_dir/ 共多出600MB。
    • 使用了cross,安装docker-ce大约需要占用280MB。docker的镜像放在了 /var/lib/docker/ 中。交叉编译的镜像,大约是1.3-2.1GB/每个镜像。(见上一节)。
    • rust的项目目录,经过4-5个target的编译,目录会占用600-900MB/每个项目cargo clean后就只有10-30MB。
    • 看来,要有40-50GB的磁盘空间,安装debian(无图形桌面)和rust,玩两个小项目,才比较宽松。
  • .rustup/, .cargo/ 可以更改存放位置(见上文); rust项目目录,可以随便选择存放位置; docker的镜像,也可以通过修改 /etc/docker/daemon.json的配置,更改默认存放位置。

debian-10,arm架构

用apt安装

  • 另一台机器。 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 编译 MarcelCoding/zia 项目,硬盘又少 2145MB。
  • 用 nightly 再 rustup run nightly cargo build -r编译 MarcelCoding/zia,硬盘又少 2592MB。
    见【udp-via-wss__haskell_安装_rust_安装】。
  • 编译(非交叉编译) 使用 fltk 的 gui 程序。因为 cmake-3.13的版本太低(需要3.15以上)。编译失败。

交叉编译测试

  • 更新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 (UOS)中,无法安装 gcc-mipsel-linux-gnu,因为包冲突。

使用 cross 交叉编译

  • cargo install cross 安装 cross 命令。
  • 就可以用 cross 替换 cargo 命令,比如 cross build --taget x86_64-unknown-linux-gnu
  • 系统需要安装 apt install docker-ceaptitude install docker-ce,因为 cross 会拉取用于交叉编译的 docker 镜像。
    docker pull 如果要配置 proxy,见【这里】。
  • 如果报错,没有权限创建docker,可以把当前用户名 加入 docker 用户组,或者修改 /var/run/docker.sock 的访问权限。
  • 拉取image镜像失败,报 /usr/bin/docker: no matching manifest for linux/arm64/v8 in the manifest list entries.
    没有用于aarch64架构的镜像。放弃!

其他

----end----


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


posted on 2023-06-27 16:22  osnosn  阅读(491)  评论(2编辑  收藏  举报