安装_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
查看。
- -C 的内容,可以通过
- x86_64, musl
以上 x86_64-unknown-linux-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 #减小体积
copy到 debian 或 centos 或 x86-openwrt-21 执行成功。(2023-06测)
copy到 debian 或 centos 或 x86-openwrt-21 执行成功。(2024-01测)#写了个程序:多线程,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,静态链接
- x86_64, gnu
以上 x86_64-unknown-linux-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 #减小体积
copy到 debian 或 centos 或 x86-openwrt-21 执行成功。(2023-06测)
copy到 debian 或 centos 或 x86-openwrt-21 执行成功。(2024-01测)#写了个程序:多线程,rusqlite RUSTFLAGS='-C target-feature=+crt-static -C link-args=-no-pie' cargo build --release --target x86_64-unknown-linux-gnu #OK,静态链接
- aarch64, musl
以上 aarch64-unknown-linux-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
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
以上 aarch64-unknown-linux-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
copy到 s905 armbian 或 腾锐D2000 deepin 执行成功。腾锐D2000 openwrt-22 执行失败 (动态库找不到)。(2023-06测)
以上 aarch64-unknown-linux-gnu,加上静态编译参数,编译成功,是静态链接。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
copy到 s905 armbian 或 腾锐D2000 deepin 或 腾锐D2000 openwrt-22 执行成功。(2023-06测)
copy到 腾锐D2000 deepin 或 腾锐D2000 openwrt-22 执行成功。(2024-01测)#写了个程序:多线程,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,静态链接
- i686/x86_64, windows, gnu
i686 是32位, x86_64 是64位。
以上 i686-pc-windows-gnu,编译成功,不知道是否是,静态链接 (没工具看),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位
copy到 x86 win10 执行成功。(2023-06测)
copy到 x86 win10 执行成功。(2024-01测)#写了个程序:多线程,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
发现,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。
以上 mipsel-unknown-linux-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
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
以上 mipsel-unknown-linux-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
copy到 mt7621 openwrt-22 不能执行 (动态库找不到)。(2023-06测)
以上 mipsel-unknown-linux-gnu,加上静态编译参数,编译成功,静态链接。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
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
以上 mips64el-unknown-linux-gnuabi64, mips64el-unknown-linux-muslabi64,编译成功。rustup target add mips64el-unknown-linux-gnuabi64 rustup target add mips64el-unknown-linux-muslabi64 apt install gcc-mips64el-linux-gnuabi64 # cargo 编译 (省略) # rustc 编译 (省略)
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 的 sdkopenwrt-sdk-22.03.5-ramips-mt7621_gcc-11.2.0_musl.Linux-x86_64.tar.xz
。
解压到自定义目录 "/opt/op-sdk-22035-mt7621"。
以上 mipsel-unknown-linux-musl,编译成功,动态链接。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
copy到 mt7621 openwrt-22 执行成功。(2023-06测)
copy到 mt7621 openwrt-22 执行成功。(2024-01测)#写了个程序:多线程,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"
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】,
结果还是编译失败,CMakeError.log 中显示(OpenGL/glu.h,sys/stdtypes.h)文件找不到。(2024-02测)# 修改 (注意: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 \ """]
修改 Cargo.toml 中 fltk设置的featuresfltk = { version = "1.4.25", features = ["fltk-bundled"] }
发现编译时会用 curl下载东西。
如果需要,可以通过环境变量给 container设置代理,在 Cross.toml 中加入代理设置,
结果编译没报错,链接失败,动态库找不到。加上"+crt-static" 结果一样失败。(2024-02测)[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"]
再改, Cross.toml,
发现 $CROSS_DEV_ARCH 变量是空的。保留 Cargo.toml 中 features。编译链接虽然失败,但报错信息少了很多。(2024-02)[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 \ """]
磁盘占用,参考
- 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。
增加一个targethttps_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
.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-ce
或aptitude 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/ .