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

对于编程来说,如果编译成功了,也就完成了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的起始位置:

猜你喜欢

转载自blog.csdn.net/robinsongsog/article/details/103813068
ii