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 .

终于成功!

相关推荐
EricWang13581 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
算法与编程之美1 小时前
文件的写入与读取
linux·运维·服务器
JaneJiazhao3 小时前
HTTPSOK:SSL/TLS证书自动续期工具
服务器·网络协议·ssl
萨格拉斯救世主3 小时前
戴尔R930服务器增加 Intel X710-DA2双万兆光口含模块
运维·服务器
无所谓จุ๊บ3 小时前
树莓派开发相关知识十 -小试服务器
服务器·网络·树莓派
Jtti3 小时前
Windows系统服务器怎么设置远程连接?详细步骤
运维·服务器·windows
yeyuningzi4 小时前
Debian 12环境里部署nginx步骤记录
linux·运维·服务器
EasyCVR4 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频
龙哥说跨境6 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
pk_xz1234568 小时前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器