安装_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。
增加一个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中,无法安装mipsel的gcc,因为包冲突。
----end----
转载注明来源: 本文链接 https://www.cnblogs.com/osnosn/p/17509203.html
来自 osnosn的博客 https://www.cnblogs.com/osnosn/ .