2023年12月8日发(作者:)
UEFI-建立属于自己的Application和library
为了能更好的理解code编译过程,我们可以通过学习操作如何进行自建并自用library去更好的理解
code的编译过程:
1. 在建立library之前,首先要写一个属于自己的Application并成功运行,这样才能在Application里面调用到自己的library:
(1)在edk2的随便一个文件夹下创建一个文件夹,名称则是你的Application的名称,文件夹里面有最基本的文件(.inf和.c)。
(2)在.c文件中写上最基本的print(helloworld)和print相关的包和库:
#include
#include
#include
EFI_STATUS
EFIAPI
UefiMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
Print(L"hello world!");
return 0;
}
(3)在.inf文件中配置[Defines],[Sources],[Packages],[LibraryClasses]几大基本部分:
#
定义了模块类型
(MODULE_TYPE)
、模块的名字
(BASE NAME)
、
#
版本号(
VERSION STRING)
、人口函数
(ENTRY POINT)
等。
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = hqx
FILE_GUID = F120EDB2-FBE6-4847-89E6-03F79085FEED
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = UefiMain
UEFI_HII_RESOURCE_SECTION = TRUE
#
定义了本模块包含的源文件或目标文件。
[Sources]
hqx.c
#
指明了要引用的包,包中的头文件可以在库的源文件中引用。
[Packages]
MdePkg/
MdeModulePkg/
#
列出了需要链接的库
[LibraryClasses]
UefiApplicationEntryPoint
UefiLib
(4) 在codeDT01_SVN_2BoardOemH46PanguBoardPkg文件夹中找到找到[Components.$(DXE_ARCH)],在这部
分添加自己写的Application的包路径地址:
[Components.$(DXE_ARCH)]
(5)以上步骤完成之后就可以点开运行(codeDT01_SVN_2BoardOemH46PanguBoardPkg)运行code,依次
执行一下命令,编译成功后在
codeDT01_SVN_2BuildH46PanguBoardPkgRELEASE_DEVTLSxVC14X64HqxPkgApplicationhqxForHqxPkghqxO
UTPUT会生成我们需要的.efi文件:
#
清除上次编译生成的文件
nmake clean
#
启动一些数据
#
编译整个
code
文件
nmake uefi64
(6)重启进入UEFI,执行.efi文件:
2.完成了第一个步骤就证明你已经建立了属于自己的Application并让它成功跑起来了,但是我们刚刚使用的print是调用uefilib库下的库函
数,那我们能不能调用自己的库然后再去调用uefilib呢?下面我们的重点来了:我们要自己建立library然后去使用它
2.1 建立自己的库(library):
(1). 在 MdePkg的Library中建立自己库名字的文件夹:
(2).在自己库的文件夹中建立基本的.c文件.inf文件和必须的UefiLibInternal.h文件:
.c文件中封装好print函数:
#include "UefiLibInternal.h"
#include
VOID
HqxShowString(
)
{
Print(L"welcome to my library!");
}
.inf中也是配置好[Defines],[Sources],[Packages],[LibraryClasses]几大基本部分:
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = Hqxlib
FILE_GUID = 280E42C3-826E-4573-9772-B74EF11B6D95
MODULE_TYPE = BASE
VERSION_STRING = 1.0
LIBRARY_CLASS = Hqxlib
[Sources]
Hqxlib.c
UefiLibInternal.h
[Packages]
MdePkg/
MdeModulePkg/
[LibraryClasses]
UefiLib
(2).在MdePkgIncludeLibrary中建立.h文件
.h文件中主要是一些宏的定义和函数的声明:
#define SHOWSTRING Print(L"welcome to my world!")
VOID
HqxShowString(
);
(3)在MdePkg文件夹下的的[LibraryClasses]中添加.h文件的地址和库名:
[LibraryClasses]
## @libraryclass Provides a Build my own library
#
Hqxlib|Include/Library/Hqxlib.h
(4)在MdePkg文件夹下的的[LibraryClasses]中添加.inf文件的地址和库名:
[LibraryClasses]
MdePkg/Library/Hqxlib/
2.2 建立好自己的library之后,接下来要做的将自己建立的library绑定到Packages里面:
(1)library所在的Packages的.dec文件的[LibraryClasses]中要包含library的.h文件位置:
[LibraryClasses]
## @libraryclass Provides a Build my own library
#
HqxLib|Include/Library/HqxLib.h
(2) library所在的Packages的.dsc文件的[LibraryClasses]中要包含library的.inf文件位置:
[LibraryClasses]
HqxPkg/Library/HqxLib/
(3) 在文件中的[LibraryClasses]中要包含library的.inf文件位置:
[LibraryClasses]
HqxLib|HqxPkg/Library/HqxLib/
2.3 最后我们要做的就是在自己的Application中调用自己的library:
(1)调用者的.inf要包含调用的Library所在的Package的dec文件
[Packages]
MdePkg/
MdeModulePkg/
#My own library.
HqxPkg/
(2) 调用者的.inf要包含调用的library的Library name:
[LibraryClasses]
UefiApplicationEntryPoint
#My own library.
HqxLib
UefiLib
(3)调用者的.c中要包含调用的Library对应的头文件:
#include
#include
//My own library.
#include
#include
文件拿去uefi运行,就能得到你想要的效果啦!


发布评论