人人都会写驱动 (EDK II 常见编译错误及其处理办法)

本文探讨了大型项目中常见的编译错误,如函数未定义、找不到头文件及类实例等问题,通过实例讲解如何逐步排查并解决这些错误,特别强调了正确使用#include指令和在INF文件中指定LIB实例的重要性。

对于编程来说,如果编译成功了,也就完成了90%。 剩下的总归可以慢慢去debug.

一个大型项目,涉及到数万个.c 文件, 往往在a.c 里面需要调用b.c 里面的函数。今天就把常见的编译错误列出来以飧读者。

举个例子:

在文件:C:\trunk\MaxwellPkg\Library\EcIoLib\EcIoLib.c 存在函数EcMailboxMEMWrite()

而我们需要在C:\trunk\System\430\PhSystemPkg\FlashCommunication\Common\TdkService.c 调用EcMailboxMEMWrite()

如果我们啥也不做,直接用,那么会出现第一个编译错误,即函数未定义。

 

1. 函数未定义:

 

2. 找不到头文件。

这时候,可能灵光一闪,要加入头文件。然后我们在.c的开头加入#include <Library/EcIoLib.h>

然后,再次编译,出现的错误为:

 

 

 

 

3. 找不到class 的实例:

我们在inf的[LibraryClasses.common] 加入要用到的lib的名字,在[Packages]加入相应的dec.

 

假设package 的名字是定义在  MawellPkg/Package.dec

类似这样的  BASE_NAME = EcIoLib

再次编译,出现的错误为:

 

解决方法为在我们要编译的dsc里面为lib指定其实现,通常一个lib 有很多个实现方式。

EcIoLib|MaxwellPkg/Library/EcIoLib/EcIoLib.inf

 

 

技术要点总结:

1. #include 的时候,为尽量要用<> ,不能用“ ”. 除非两个.c文件位于同一个目录(文件夹)两者差别,百度可以搜到。

即尖括号是在库里面找,而双引号是在当前目录找。

#include <Library/EcIoLib.h>    Right

 

#include "Library/EcIoLib.h"  Not recommend

2. include 的时候,路径起始点由其相应的的dec文件 include section 决定:

#ifndef _IP6_NV_DATA_H_
#define _IP6_NV_DATA_H_

#include <Guid/Ip6ConfigHii.h>   guid  刚好在include 后面

因为dec指定了Include的起始位置:

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值