UEFI 最小应用模板:.c / .inf / .dec / .dsc 完整示例

UEFI 最小应用模板:.c / .inf / .dec / .dsc 完整示例
UEFI 应用开发最小完整示例1. 三文件职责文件一句话职责.inf你写的。告诉编译器入口叫啥有哪些源文件依赖哪些库。.dec包作者写的。告诉编译器我的头文件在哪我能提供哪些库。.dsc项目总管写的。告诉编译器库的实体在哪这次编译哪些模块。2. 完整代码2.1MyApp.c—— 源代码#includeUefi.h#includeLibrary/UefiLib.hEFI_STATUSUefiMain(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE*SystemTable){Print(LHello UEFI!\n);returnEFI_SUCCESS;}2.2MyApp.inf—— 应用说明书[Defines] INF_VERSION 1.25 BASE_NAME MyApp FILE_GUID 12345678-1234-1234-1234-123456789ABC MODULE_TYPE UEFI_APPLICATION ENTRY_POINT UefiMain # 1. 入口叫啥 [Sources] MyApp.c # 2. 有哪些源文件 [Packages] MdePkg/MdePkg.dec # 3. 依赖的包为了用它提供的头文件 [LibraryClasses] UefiApplicationEntryPoint # 4. 依赖的库类提供UefiMain入口包装代码让固件调用你的函数 UefiLib # 因为用了 Print() 函数这个库提供 Print 的实现2.3MdePkg.dec—— 包的公开声明这是 EDK2 自带的包不用自己写但必须看懂。它长这样[Defines] PACKAGE_NAME MdePkg [Includes] Include # 头文件路径MdePkg/Include/ [LibraryClasses] UefiLib|Include/Library/UefiLib.h # 声明有这个库并指定头文件 UefiApplicationEntryPoint|Include/Library/UefiApplicationEntryPoint.h2.4 项目.dsc文件你需要添加的内容# .dsc 文件的作用 # 1. 给“库类名”指派具体的“库实现文件.inf” # 2. 决定这次要编译哪些模块 [LibraryClasses] # 当某个模块在它的 .inf 里声明需要 UefiLib 时就用下面这个 .inf 作为实现 UefiLib|MdePkg/Library/UefiLib/UefiLib.inf # 同上这是 UefiApplicationEntryPoint 这个库类对应的实体 UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf [Components] # 告诉构建系统这次编译把 MyApp 这个模块包含进去 MyApp/MyApp.inf3. 它们怎么协作一次完整的编译过程编译器读MyApp.inf知道入口是UefiMain需要UefiLib这个库。编译器去.dsc的[LibraryClasses]里找到UefiLib对应的实现库文件UefiLib.inf。编译MyApp.c时遇到#include Library/UefiLib.h编译器根据MdePkg.dec的[Includes]知道去MdePkg/Include/Library/下找这个头文件。三个文件各回答一个问题流程清清楚楚。4. 速查表问题答案所在关键字段入口函数叫啥.infENTRY_POINT#include的头文件在哪.dec[Includes]库函数的实体是哪个 .inf.dsc[LibraryClasses]我的应用参不参与编译.dsc[Components]