RISC-V GNU Toolchain 工具链安装问题解决(stdio.h 问题解决,pk fence.i 问题解决)

我的安装过程主要参照 riscv-collab/riscv-gnu-toolchain 的官方 Readme 和这位佬的博客:RSIC-V工具链介绍及其安装教程 - 风正豪 (大佬的博客写的非常详细,唯一不足就是 sudo make linux -jxx 是全部小写。)

工具链前前后后我装了快5遍了,这篇博客主要是遇到的问题解决方案分享。

如果你要使用 spike & pk 模拟器

configure 的时候请务必加上如下选项!你也不想花40分钟重新编译吧。

shell 复制代码
--with-arch=rv64gc_zifencei

再 make -jN 编译后,pk 编译时就不会出现 unrecognized fence.i 问题了,原理上简单来说大概是 pk 需要用到这条指令,但是这个指令所属的扩展默认不包含在 toolchain 里,所以需要手动加上。

参考:https://github.com/riscv-software-src/riscv-pk/issues/260

submodule 克隆失败

当然如果大家按照上面的博客中的虚拟机魔法配置方法修改上网后,克隆应该不会出问题。不过我自己采取更保险的方式是,根据根目录中的 .gitmodules 文件,在每个文件夹里分别手动克隆并切换分支 / 版本。(下面其中部分代码由于个人习惯我改为了 ssh 地址)

.gitmodules 复制代码
[submodule "binutils"]
	path = binutils
	url = https://sourceware.org/git/binutils-gdb.git
	branch = binutils-2_42-branch
[submodule "gcc"]
	path = gcc
	url = https://gcc.gnu.org/git/gcc.git
	branch = releases/gcc-13
[submodule "glibc"]
	path = glibc
	url = https://sourceware.org/git/glibc.git
[submodule "dejagnu"]
	path = dejagnu
	url = https://git.savannah.gnu.org/git/dejagnu.git
	branch = master
[submodule "newlib"]
	path = newlib
	url = https://sourceware.org/git/newlib-cygwin.git
	branch = master
[submodule "gdb"]
	path = gdb
	url = https://sourceware.org/git/binutils-gdb.git
	branch = gdb-14-branch
[submodule "qemu"]
	path = qemu
	url = https://gitlab.com/qemu-project/qemu.git
[submodule "musl"]
	path = musl
	url = https://git.musl-libc.org/git/musl
	branch = master
[submodule "spike"]
	path = spike
	url = git@github.com:riscv-software-src/riscv-isa-sim.git
	branch = master
[submodule "pk"]
	path = pk
	url = git@github.com:riscv-software-src/riscv-pk.git
	branch = master
[submodule "llvm"]
	path = llvm
	url = git@github.com:llvm/llvm-project.git
	branch = release/17.x

比如:

shell 复制代码
cd pk
git clone git@github.com:riscv-software-src/riscv-pk.git
git checkout release/17.x

再根据官网版本号切换:

git 复制代码
git reset --hard 2efabd3

最后执行 git submodule update --init 的时候其实相当于一个校验的过程。

stdio.h 找不到的问题

臭名昭著的问题。

其实本质原因在于我们用的不是自己编译安装的这个工具链,而是 ubuntu apt 下载的 gcc-riscv64-unknown-elf ,这个东西自从 ubuntu20 版本之后应该就有问题(头文件找不全)。可以通过 whereis riscv64-unknown-elf-gcc 查看我们使用工具链的优先级。

我们自己编译安装的工具链位于:/opt/riscv/bin

ubuntu apt 安装的工具链位于:/usr/bin

如图,这是我执行 riscv64-unknown-elf-gcc -v hello.c 时的部分输出信息:

正常来说 stdio.h 应该是在红框中的 /usr/riscv64-unknown-elf/include 里,但是 ubuntu 安装的时候缺少这个内容所以很多同学都遇到了这个工具链无法使用的问题。我们不要用它,用我们自己编译出来的 /opt/riscv/bin 里的工具链。只需要执行 sudo apt remove gcc-riscv64-unknown-elf 后重新打开窗口即可。

可以参考这个 issue 的讨论:stdio.h 头文件找不到 其中给出的另一种解决方式是使用另一款 ubuntu apt 安装的工具链:sudo apt install gcc-riscv64-linux-gnu ,其实这两种工具链我们的 riscv-gnu-toolchain 里面都有。

简单来说就是:

ubuntu 安装 newlib 工具链:sudo apt install gcc-riscv64-unknown-elf 用不了,报错 stdio.h 找不到

ubuntu 安装 linux 工具链:sudo apt install gcc-riscv64-linux-gnu 能用

但是我们自己编译的 riscv-gnu-toolchain 里面这两种都有,我建议要么就都用我们自己的,要么就只用 ubuntu 安装的 gcc-riscv64-linux-gnu .

终于成功!

相关推荐
牛奶咖啡1314 分钟前
Linux系统的常用操作命令——文件远程传输、文件编辑、软件安装的四种方式
运维·服务器·软件安装·linux云计算·scp文件远程传输·vi文件编辑·设置yum的阿里云源
weixin_4373982119 分钟前
转Go学习笔记(2)进阶
服务器·笔记·后端·学习·架构·golang
tan77º2 小时前
【Linux网络编程】Socket - UDP
linux·服务器·网络·c++·udp
szxinmai主板定制专家3 小时前
【精密测量】基于ARM+FPGA的多路光栅信号采集方案
服务器·arm开发·人工智能·嵌入式硬件·fpga开发
你不知道我是谁?3 小时前
负载均衡--四层、七层负载均衡的区别
运维·服务器·负载均衡
九丝城主4 小时前
2025使用VM虚拟机安装配置Macos苹果系统下Flutter开发环境保姆级教程--中篇
服务器·flutter·macos·vmware
码出钞能力4 小时前
linux内核模块的查看
linux·运维·服务器
小皮侠6 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github
ddfa12348 小时前
XML 笔记
xml·服务器
海外空间恒创科技8 小时前
一台香港原生ip站群服务器多少钱?
服务器·网络协议·tcp/ip