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