使用Makefile执行QEMU启动U-Boot报错,直接执行命令正常
解决方案
以下是几种可能的原因及对应的解决办法:
1. QEMU在非交互式环境下无法正常启动
Make默认在非交互式子shell中执行命令,QEMU启动时需要访问终端进行交互(如输出U-Boot控制台、接收输入),但这种环境下终端不可用,导致QEMU初始化失败并返回错误码1。而直接在shell中执行时,终端是交互式的,QEMU能正常运行。
解决办法:
给QEMU命令添加终端相关参数,强制其使用标准IO作为终端:
.PHONY : runuboot runuboot : qemu-6.2.0/build/aarch64-softmmu/qemu-system-aarch64 -machine virt -kernel u-boot.v2022.07/u-boot -nographic
-nographic参数会让QEMU禁用图形界面,直接使用当前终端的stdin/stdout作为控制台,这样在Make环境下也能正常交互。
如果需要保留图形界面,可尝试添加-serial stdio参数:
runuboot : qemu-6.2.0/build/aarch64-softmmu/qemu-system-aarch64 -machine virt -kernel u-boot.v2022.07/u-boot -serial stdio
2. Make严格检查命令退出码
Make会将命令的非0退出码判定为执行失败,即使命令本身功能正常。如果QEMU启动后因某些原因返回非0码但实际运行正常,可让Make忽略该错误:
解决办法:
在命令前添加-符号,告诉Make忽略命令的退出码:
runuboot : -qemu-6.2.0/build/aarch64-softmmu/qemu-system-aarch64 -machine virt -kernel u-boot.v2022.07/u-boot
注意:这只是绕过错误提示,若QEMU确实存在启动问题,该方法无法解决根本问题。
3. Make与Shell的环境变量差异
少数情况下,Make使用的环境变量(如PATH、TERM)与当前shell不一致,导致QEMU执行异常。可以强制Make使用当前shell的环境:
解决办法:
调用Make时传递SHELL参数,指定使用当前bash环境:
make runuboot SHELL=/bin/bash
或者在Makefile开头添加:
SHELL := /bin/bash
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

