引入EDK2的UefiSpec.h后报“unknown type name ‘UINT8’”错误求助
解决UEFI程序编译时UINT8等类型未定义的问题
问题根源
你当前的头文件包含顺序颠倒了EDK2头文件的依赖逻辑:
UefiSpec.h内部会引用UINT8、EFI_STATUS这类基础类型,但你先包含了UefiSpec.h,之后才包含定义这些类型的ProcessorBind.h、Base.h,导致编译器处理UefiSpec.h时找不到类型定义。
修复步骤
- 调整头文件包含顺序:先包含基础类型定义的头文件,再包含高层UEFI规范相关的头文件。正确的包含顺序示例:
#include <stdint.h> #include <inttypes.h> #include <stddef.h> // NULL // 先包含基础类型定义 #include "./Include/Base.h" #include "./Include/X64/ProcessorBind.h" // 再包含UEFI相关头文件 #include "./Include/Uefi/UefiBaseType.h" #include "./Include/Uefi/UefiSpec.h" #include "./Include/Protocol/LoadedImage.h"
- 简化依赖(可选):
Base.h内部已经会根据目标架构自动包含对应的ProcessorBind.h(比如X64架构的版本),所以你可以去掉单独的#include "./Include/X64/ProcessorBind.h",避免重复包含。
额外注意
- EDK2的头文件有严格的依赖层级,基础类型定义(
Base.h、ProcessorBind.h)是所有其他头文件的前置依赖,必须最先包含。 - 你的编译命令
x86_64-w64-mingw32-gcc -Wl,--subsystem,10 -e efi_main -I "./Include" -std=c17 -Wall -Wextra -Wpedantic -mno-red-zone -ffreestanding -nostdlib符合UEFI编译要求,无需修改。
内容的提问来源于stack exchange,提问作者moxede3067
相关产品推荐
相关产品推荐

