NJU-ProjectN / nemu

NJU EMUlator, a full system x86/mips32/riscv32/riscv64 emulator for teaching
Other
858 stars 184 forks source link

编译【spike-diff】时终端报【error: 'optional' in namespace 'std' does not name a template type】错误 #62

Closed myyerrol closed 1 year ago

myyerrol commented 1 year ago

开发环境 系统版本:WSL2 Ubuntu 20.04.5 LTS GCC版本:9.4.0 (Ubuntu 9.4.0-1ubuntu~20.04.1) 指令架构:riscv64

问题描述 在开启CONFIG_DIFFTEST宏之后,在nemu目录下执行make run命令,终端会报很多类似下图中的错误。 image

原因分析 结合报错信息上网查找相关资料,得知optional是C++17标准中引入的新功能,而9.4.0版本的GCC默认使用的是C++11标准,所以需要在编译时通过参数指定C++标准版本。于是接下来我排查了动态生成的spike-diff/repo/build/Makefile文件,发现C++编译选项中已经添加了-std=c++17参数,即已经开启了对C++17标准的支持。但是为什么还会出现这种问题?optional是在GCC 7.2中首次从实验标准转为正式标准,GCC 9中肯定也存在。

后来终于发现在nemu/tools/spike-diff/Makefile中添加-std=c++17能编译成功,可是编译出错的位置是在spike仓库内部,并不在spike-diff中,说明在编译生成spike的静态链接库时编译依赖会向上传递?总之,该问题应该与GCC版本有关,某些版本的编译器需要手动添加参数。

问题发现者 @Jasonyanyusong @myyerrol

解决方案 如下图所示,在nemu/tools/spike-diff/Makefile文件中的编译选项中添加-std=c++17即可。 image

sashimi-yzh commented 1 year ago

fix in #63