UEFI工程模块文件-库模块
前言
在传统C/C++项目开发中经常会用到库,在UEFI大型工程项目开发中也是这样的。EDK2也提供库模块,来实现它。
一、库模块的工程文件
1. 语法
基本语法和前面文章讲到的用法相似,但是需要注意一下几点:
- [Defines]块
MODULE_TYPE
设置为BASE
LIBRARY_CLASS
设置为库名字- 不需要设置
ENTRY_POINT
- [Packages]
列出库引用到的包 - [LibraryClasses]列出包所依赖的其它库
2. 使用注意事项
- 有些库只能被某些特定的模块调用,所以在使用的时候要声明库的使用范围,声明方法是在[Defines]块的
LIBARAY_CLASS
变量中定义,格式如下:
LIBRARY_CLASS = 库名称 | 适用模块类型1 适用模块类型 2
LIBRARY_CLASS = zlib | UEFI_APPLICATION
- 编写好库后,要是库能被其它模块调用,还要在包的
.dsc
文件中声明该库。在[LibraryClasses]添加库模块的工程文件路径即可。
[LibraryClasses]
zlib | zlib/zlib.inf
- 调用库模块时,只需要在调用模块的工程文件中将被调用的库模块的库名假如[LibraryClasses]列表即可。
[LibraryClasses]
zlib
- 有些库使用之前需要进行初始化,在库的工程文件中需要指定
CONSTRUCTOR
和DISTRUCTOR
,CONSTRUCTOR
会加入到ProcessLibraryConstructorList中,这个CONSTRUCTOR
函数会在ENTRY_POINT
之前执行;DESTRUCTOR
函数会加入到ProcessLibraryDestructorList中,这个DESTRUCTOR
会在ENTRY_POINT
之后执行。
//例如:在zlib调用之前需要用InitializeLib()中初始化,在zlib调用之后需要LibDestructor清理zlib库占用的资源需要进行下面设置
[Defines]
CONSTRUCTOR = InitializeLib
DESTRUCTOR = LibDestructor
二、总结
库文件的使用,需要注意上面的几点注意事项。万变不离其宗,UEFI工程模块是存在相似性的,在使用中慢慢就得其道了。
参考资料
<1> 《UEFI原理与编程》 戴正华著。