11 Ubuntu | 省时省事| riscv-gnu-toolchain工具链安装|无需编译

本文讲述了作者如何避免编译安装RISC-V工具链的繁琐过程,通过下载预编译包并将其添加到环境变量中,实现快速且高效的RISC-VGNU工具链安装,验证了安装的成功。

文章目录

  • 序言
  • 下载预编译包
  • 解压缩,观察该包
  • 添加环境变量
  • 验证安装成功

序言

大家好我是优快云不知名放弃领域创作者早上真好,最近想放弃学习RISC-V了,所以首先得入门。
入门RISC-V,当然需要安装RISCV的工具链,目前大多数教程都是编译安装的,这很难顶。我从GitHub上clone这个仓库,使用的命令是

git clone --recursive https://github.com/riscv-collab/riscv-gnu-toolchain.git -b master --depth 1

明眼人都看得出来我真的已经尽力减小clone的量了,但是还是给我下了3个G的代码量(?)都没下完,查资料的时候看到一个老哥评论区里说“已经编译一周了”,真是令人害怕。

但是编译安装其实并不是必要的吧,除了一些比较特殊的平台,其他平台有现成的编译包才是正常的吧,就像Linux常见的发行版和定制内核一样。

下载预编译包

预编译包当然是Github仓库的release里面都有,为什么我搜出来的教程都是编译安装的?!
riscv-gnu-toolchain Release
进去之后全是Nightly,基本隔几天就有个新tag,我一直翻到2022年,没有找到1个Stable,看来一定是我的问题吧!那就安装符合要求的最新版了。

我也不知道大家需要的版本是什么,知道的大家就

ttk@ttk-VMware-Virtual-Platform:~/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain$ git submodule sync git submodule update --init --recursive 为 'binutils' 同步子模组 url 为 'dejagnu' 同步子模组 url 为 'gcc' 同步子模组 url 为 'gdb' 同步子模组 url 为 'glibc' 同步子模组 url 为 'llvm' 同步子模组 url 为 'musl' 同步子模组 url 为 'newlib' 同步子模组 url 为 'pk' 同步子模组 url 为 'qemu' 同步子模组 url 为 'spike' 同步子模组 url 为 'uclibc-ng' 同步子模组 url 正克隆到 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/binutils'... fatal: 仓库 'https://mirrors.tuna.tsinghua.edu.cn/git/bminor/binutils-gdb.git/' 未找到 fatal: 无法克隆 'https://mirrors.tuna.tsinghua.edu.cn/git/bminor/binutils-gdb.git' 到子模组路径 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/binutils' 克隆 'binutils' 失败。按计划重试 正克隆到 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/gcc'... fatal: 仓库 'https://mirrors.tuna.tsinghua.edu.cn/git/gcc-mirror/gcc.git/' 未找到 fatal: 无法克隆 'https://mirrors.tuna.tsinghua.edu.cn/git/gcc-mirror/gcc.git' 到子模组路径 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/gcc' 克隆 'gcc' 失败。按计划重试 正克隆到 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/gdb'... fatal: 仓库 'https://mirrors.tuna.tsinghua.edu.cn/git/bminor/binutils-gdb.git/' 未找到 fatal: 无法克隆 'https://mirrors.tuna.tsinghua.edu.cn/git/bminor/binutils-gdb.git' 到子模组路径 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/gdb' 克隆 'gdb' 失败。按计划重试 正克隆到 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/glibc'... fatal: 仓库 'https://mirrors.tuna.tsinghua.edu.cn/git/bminor/glibc.git/' 未找到 fatal: 无法克隆 'https://mirrors.tuna.tsinghua.edu.cn/git/bminor/glibc.git' 到子模组路径 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/glibc' 克隆 'glibc' 失败。按计划重试 正克隆到 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/llvm'... fatal: 仓库 'https://mirrors.tuna.tsinghua.edu.cn/git/llvm/llvm-project.git/' 未找到 fatal: 无法克隆 'https://mirrors.tuna.tsinghua.edu.cn/git/llvm/llvm-project.git' 到子模组路径 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/llvm' 克隆 'llvm' 失败。按计划重试 正克隆到 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/newlib'... fatal: 仓库 'https://mirrors.tuna.tsinghua.edu.cn/git/bminor/newlib.git/' 未找到 fatal: 无法克隆 'https://mirrors.tuna.tsinghua.edu.cn/git/bminor/newlib.git' 到子模组路径 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/newlib' 克隆 'newlib' 失败。按计划重试 正克隆到 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/pk'... fatal: 仓库 'https://mirrors.tuna.tsinghua.edu.cn/git/riscv-software-src/riscv-pk.git/' 未找到 fatal: 无法克隆 'https://mirrors.tuna.tsinghua.edu.cn/git/riscv-software-src/riscv-pk.git' 到子模组路径 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/pk' 克隆 'pk' 失败。按计划重试 正克隆到 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/qemu'... fatal: 无法访问 'https://gitlab.com/qemu-project/qemu.git/':CONNECT tunnel failed, response 301 fatal: 无法克隆 'https://gitlab.com/qemu-project/qemu.git' 到子模组路径 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/qemu' 克隆 'qemu' 失败。按计划重试 正克隆到 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/spike'... fatal: 仓库 'https://mirrors.tuna.tsinghua.edu.cn/git/riscv-software-src/riscv-isa-sim.git/' 未找到 fatal: 无法克隆 'https://mirrors.tuna.tsinghua.edu.cn/git/riscv-software-src/riscv-isa-sim.git' 到子模组路径 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/spike' 克隆 'spike' 失败。按计划重试 正克隆到 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/uclibc-ng'... fatal: 仓库 'https://mirrors.tuna.tsinghua.edu.cn/git/wbx-github/uclibc-ng.git/' 未找到 fatal: 无法克隆 'https://mirrors.tuna.tsinghua.edu.cn/git/wbx-github/uclibc-ng.git' 到子模组路径 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/uclibc-ng' 克隆 'uclibc-ng' 失败。按计划重试 正克隆到 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/binutils'... fatal: 仓库 'https://mirrors.tuna.tsinghua.edu.cn/git/bminor/binutils-gdb.git/' 未找到 fatal: 无法克隆 'https://mirrors.tuna.tsinghua.edu.cn/git/bminor/binutils-gdb.git' 到子模组路径 '/home/ttk/riscv-gnu-toolchain/riscv-gnu-toolchain/riscv-gnu-toolchain/binutils' 第二次尝试克隆 'binutils' 失败,退出 怎么办
08-01
<think>我们正在解决用户在使用`git submodule update --init --recursive`命令时,由于多个子模块无法访问(可能是网络问题或权限问题)而导致的克隆失败问题。 根据用户提供的引用[1]和引用[2],我们可以知道: 引用[1]提到两种拉取子模块的方法:一是在克隆时使用`--recursive`参数;二是在克隆后进入项目目录,先执行`git submodule init`再执行`git submodule update`。 引用[2]提到在切换分支后可能遇到子模块目录为空的情况,此时可以进入子模块目录运行`git checkout .`来恢复文件,或者使用`git submodule foreach`命令批量处理。 但是用户的问题是在执行`git submodule update --init --recursive`时多个子模块克隆失败。这通常是由于子模块的远程仓库无法访问(例如,网络问题、仓库地址变更、权限不足等)造成的。 解决方案思路: 1. 逐个尝试更新子模块:由于是多个子模块失败,我们可以尝试单独初始化并更新每个子模块,这样可以在失败时知道是哪个子模块出了问题。 2. 检查网络连接和权限:确保可以访问子模块的远程仓库。 3. 修改子模块的远程地址:如果某些子模块的地址已经变更,或者用户没有权限,可能需要修改.gitmodules文件中相应子模块的URL,或者使用替代的URL(如镜像地址)。 4. 使用代理:如果是因为网络限制,可以尝试配置git使用代理。 5. 手动克隆:对于失败的子模块,手动克隆到指定路径,然后尝试更新。 具体步骤: 步骤1:查看子模块状态 使用命令:`git submodule status` 这将列出所有子模块的提交哈希、路径和状态。 步骤2:尝试逐个初始化并更新子模块 我们可以使用一个脚本来遍历每个子模块,逐个进行初始化和更新,这样即使某个子模块失败,也不会影响其他子模块的更新,并且可以知道是哪个子模块失败。 例如: ```bash git submodule init git submodule foreach --recursive git reset --hard git submodule update --recursive --init -j 1 ``` 这里使用`-j 1`来限制同时进行的任务数为1,这样可以看到每个子模块的更新情况。 或者,更细致地: ```bash for submodule in $(git config --file .gitmodules --get-regexp path | awk '{print $2}'); do git submodule update --init --recursive -- $submodule done ``` 步骤3:处理失败的子模块 当某个子模块更新失败时,我们可以尝试手动克隆: 1. 在`.gitmodules`文件中找到该子模块的URL。 2. 尝试手动克隆:`git clone <url> <path>`,其中`<path>`是子模块的路径(相对于项目根目录)。 3. 如果手动克隆也失败,则检查URL是否正确,或者尝试使用其他镜像URL。 如果发现URL需要修改,可以更新.gitmodules文件中的URL: ```bash git config --file=.gitmodules submodule.<path>.url <newurl> ``` 然后重新运行更新该子模块: ```bash git submodule sync --recursive -- <path> git submodule update --init --recursive -- <path> ``` 步骤4:使用代理 如果是因为网络问题无法访问,可以尝试设置git代理: ```bash git config --global http.proxy http://proxy.example.com:8080 git config --global https.proxy https://proxy.example.com:8080 ``` 更新子模块后再关闭代理: ```bash git config --global --unset http.proxy git config --global --unset https.proxy ``` 步骤5:如果子模块更新后出现空目录(如引用[2]所述) 进入该子模块目录,然后执行: ```bash git checkout . ``` 或者使用`git submodule foreach`命令: ```bash git submodule foreach --recursive git checkout . ``` 步骤6:如果子模块的URL是SSH格式且用户没有权限,可以尝试切换成HTTPS格式(或者反之),因为HTTPS可能更容易通过代理,而SSH可能需要配置密钥。 示例:修改子模块URL 假设子模块路径为`riscv-gcc`,原URL为`git@github.com:riscv/riscv-gcc.git`,我们可以改为HTTPS格式:`https://github.com/riscv/riscv-gcc.git`。 注意:修改.gitmodules后,需要运行`git submodule sync`来同步到.git/config中。 总结步骤: 1. 检查子模块状态:`git submodule status` 2. 逐个更新子模块,找出失败的具体子模块。 3. 对于失败的子模块,尝试手动克隆,或者修改URL(可能需要使用镜像地址)。 4. 设置代理(如果需要)。 5. 如果子模块目录为空,使用`git checkout .`恢复。 另外,如果用户的项目有很多子模块,而且这些子模块又嵌套子模块,递归更新可能会很耗时。因此,在更新时加上`--recursive`参数是必要的。 如果用户的问题是由于某些仓库在国内访问缓慢,可以考虑使用国内的镜像源。例如,将github.com的URL替换为国内镜像的URL(如果有的话)。 最后,建议用户在执行这些操作之前备份工作目录,以防万一。 相关问题: 1. 如何修改git子模块的远程仓库地址? 2. 如何为git配置代理以加速子模块的下载? 3. 如何递归地更新所有子模块到最新版本? 4. 当子模块更新失败时,如何跳过该子模块继续更新其他子模块? 5. 如何移除一个子模块?</think>### 解决 Git 子模块克隆失败问题 当执行 `git submodule update --init --recursive` 遇到多个子模块克隆失败时(常见于网络问题或仓库权限限制),可通过以下步骤解决: #### 1. **手动初始化子模块(核心方法)** ```bash # 初始化所有子模块配置(不更新内容) git submodule init # 逐个更新子模块(跳过失败项) git submodule foreach --recursive 'git submodule update --init || echo "跳过失败模块"' ``` 此方法允许单独处理每个子模块,避免整体失败。失败模块会显示错误信息,便于定位问题[^1]。 #### 2. **修改子模块 URL(适用于仓库迁移或访问限制)** ```bash # 编辑子模块配置文件 vim .gitmodules # 将原URL(如 git@github.com:xxx/yyy.git)替换为: # - HTTPS协议:https://github.com/xxx/yyy.git # - 国内镜像:https://gitee.com/mirrors/yyy.git # 同步新URL到本地配置 git submodule sync ``` #### 3. **代理设置(解决网络问题)** ```bash # 临时启用代理(示例) git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:7890 # 更新子模块 git submodule update --init --recursive # 完成后关闭代理 git config --global --unset http.proxy git config --global --unset https.proxy ``` #### 4. **手动克隆缺失仓库** 对持续失败的子模块: ```bash # 进入父模块目录 cd parent-module # 删除无效子模块文件夹 rm -rf problem-submodule # 手动克隆(使用修改后的URL) git clone https://new-url.com/problem-submodule # 注册到父仓库 git submodule absorbgitdirs problem-submodule ``` #### 5. **恢复异常状态** 若子模块目录异常为空(如切换分支后): ```bash # 进入子模块目录执行恢复 git submodule foreach --recursive 'git checkout .' ``` > **关键提示**: > - 优先尝试 **HTTPS协议** 替代 SSH(解决密钥问题) > - RISC-V 工具链等大型项目建议使用 **镜像仓库**(如 Gitee 镜像) > - 递归更新时添加 `-j 4` 参数可加速(如 `git submodule update --init --recursive -j 4`)[^2] --- ### 相关问题 1. 如何永久修改 Git 子模块的远程仓库地址? 2. 使用 `git submodule` 时如何避免递归更新过程中的网络超时? 3. 子模块更新失败后如何清理残留文件并重新尝试? 4. 如何批量检查项目中所有子模块的同步状态? [^1]: 引用自 Git 子模块文档:通过分步操作隔离错误模块 [^2]: 引用自 Git 高级技巧:并行任务加速子模块处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早上真好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值