UEFI 0基础小白,从0开始写UEFI APP程序,慢慢爬坑中~~~
最近越过了搭建编译环境的坑,按照【UEFI编程实践】这本书的进度,来到了DSC和DEC文件结构这里,移植c文件和dsc文件,编译一个模块,在这里也卡了2天,记录一下整个过程,便于回顾。
1,文件准备
使用的工程文件是随书代码,代码可以在github上下载,用到了chapter3中间的Uefi_Main
2,自己在edk2文件夹下建立一个AlexPkg文件夹,将下载的代码ROBINPkg中的Applications和Drivers两个文件夹拷贝在AlexPkg下,将Uefi_Main拷贝到AlexPkg下,并新建AlexPkg.dec和AlexPkg.dsc两个文件。
3,DEC和DSC文件内容
DEC文件:按照书中3.3.1节,填写DEC文件内容。
DSC文件:大部分拷贝原代码内容,在components中添加
AlexPkg/Applications/Stdlib_Main/Stdlib_Main.inf
4,编译 build -p AlexPkg\AlexPkg.dsc -m AlexPkg\Applications\Stdlib_Main\Stdlib_Main.inf -a X64
5,错误出现!
可以看到出现了library class [RegisterFilterLib] is not found找不到的错误,而且是在Baselib.inf中找不到,那么我们先看看Baselib中怎么写的:
BASELIB.inf中确实有这么写,为什么找不到呢?那必须是路径不对啊,先搜一下这个RegisterFilterLib在哪里,原来是在library文件夹中,但是只有一个.h文件,.c文件在哪里?下面这个NULL.c 有点像,打开看看呗。发现这个C文件中的函数还真和.h文件对应。
那没说的,肯定是文件路径不对,那我就把这俩文件拷到baselib.inf文件夹下呗。实践证明,这一招行不通,仍然出现原错误。
那就在baselib.inf中制定路径,这下总可以了吧,实践证明,还是不行,(友情提示,不能只加路径,编译时会不识别,而是要 libname|PATH/XXX.inf的格式)会出现如下错误:
这么多问题,看不懂,搞不清楚,咋整?编译不过就删掉,说不定这个库用不上呢,别说,还是有点效果,但是用到的函数又找不到了:
所以不能删除。 一筹莫展之际,只能再上网找找灵感,有一篇博客提醒了我:
链接:UEFI EDK2 编译报找不到library class如何办?_Wang20122013的博客-CSDN博客
看到entrypoint这里,这个不是在工程的dsc文件中指定吗?也就是我的AlexPkg.dsc文件中,在这里添加路径会不会收到奇效?所以将路径添加到最外层的DSC文件中试试,
结果编译成功!
总结:
1,这个问题的实质就是在里层的inf文件中调用了某个库,但是在外层的inf中没有指定,造成了找不到库的错误,但是在里层的inf中制定路径,又会出现其他问题,说明库的调用时有耦合的,在里层的baselib中编译RegisterFilterLib会造成文件缺失,而放在整个工程的dsc文件中,由于用到的其他库都比较全,所以编译会成功。
2,要从错误信息一直往上追,不要以为标准的库不能动,要深入源码,修改,尝试,不成功不要紧,而要从错误中间寻找蛛丝马迹,总有解决的时候。
3,遇到问题,上网先搜一下,可能会没有想要的答案,但往往会看到一些解决问题的思路,找到一些灵感。而且经过认识的加深,可能起初看不懂,或者觉得没有帮助的信息,经过自己话时间调试后,再看时就会有不同理解,说明不是没帮助,而是你自己的认知没达到那个深度,看不懂而已,所以多练,多看,回头看很重要。
4,遇到不熟悉的问题,先理清思路,特别是对于这种刚学习,不熟悉的问题,要从整个工程的编译顺序,架构上去考虑,先理清整个过程,编译执行的顺序是什么,过程中用到哪些文件,哪些依赖,出问题在哪一步,可能的原因是什么。有清晰的脉络了再下手,有目的性的修改,尝试,胆大心细,没什么是不能修改的,多尝试,修改,反复回馈,直至解决问题。