使用Visual Studio构建UEFI驱动程序

4
我需要关于如何使用Visual Studio 2012项目构建EDK2 SDK中的UEFI驱动程序。 我尝试静态链接UefiLib.lib,但是一直失败。 我已将lib添加到链接器下的附加依赖项中。
#include  <Uefi.h>
#include  <Library/UefiLib.h>

EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
 Print((CHAR16 *)L"Welcome to the world of EDK II.\n");
 return EFI_SUCCESS;
}

错误是

test.obj : error LNK2001: unresolved external symbol "unsigned __int64 __cdecl Print(unsigned short const *,...)" (?Print@@YA_KPEBGZZ)

现在我已经使用DUMPBIN来确保Print存在于库中,但它存在于存档成员中而不是作为导出或导入。我不确定这是否是问题所在。
1个回答

4
您不能单独构建UEFI驱动程序或应用程序,必须在EDK2源代码树中完成,其中包括许多编译和链接EDK2组件所必需的头文件和库。EDK2组件必须使用EDK2构建工具构建,C编译器/链接器只是EDK2构建过程的一步。您应该从使用命令行开始构建,以确保您正确设置了环境,然后可以尝试将要开发的组件带入Visual Studio。
在Visual Studio中,您可以创建一个Makefile项目-这是必要的,以指定所有自定义构建步骤。例如,转到项目的属性页,在“配置属性”->“NMake”->“常规”->“构建命令行”下。将以下代码放入“Build Command Line”中; 它将允许您构建整个AppPkg软件包,其中包括您正在尝试构建的Hello应用程序。
cd C:\src\edk2
call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" x86
call edksetup.bat
build.exe -p c:\src\edk2\AppPkg\AppPkg.dsc -t VS2012x86  -b DEBUG

如果您只想构建Hello,您将需要自定义AppPkg.dsc文件,该文件用于构建AppPkg包。使用build.exe实用程序的更高级命令行开关可以进一步调整构建过程-您需要学习TianoCore.org提供的EDK2手册。

上述步骤应该帮助您开始在Visual Studio中构建UEFI应用程序/驱动程序,但您可能想使用Visual Studio进行强大的智能感知和调试功能。为此,您应该从构建Nt32Pkg包开始,在Windows中创建EFI仿真环境,并允许您像常规Windows应用程序一样逐步执行代码和调试UEFI驱动程序/应用程序。设置Visual Studio项目以执行此操作有些棘手,除非您使用专门用于UEFI开发的VS扩展名来自动化所有这些工作,例如Phoenix Core Architect。但是,也可以手动完成,您只需要将EDK2源代码的部分或全部文件/文件夹结构手动添加到VS Solution Explorer中。 Nt32Pkg构建的结果是Windows应用程序C:\ src \ edk2 \ Build \ NT32IA32 \ DEBUG_VS2012x86 \ IA32 \ SecMain.exe-这应该可以让您在Windows环境中开始并介绍UEFI。


1
“你不能单独构建UEFI驱动程序或应用程序,必须在EDK2源代码树中完成。” - 这不是真的。我正在使用Visual Studio 2015构建UEFI文件系统驱动程序,而没有使用EDK2,在https://github.com/pbatard/efifs上。你只需要作为子模块的gnu-efi即可。 - Akeo
这个问题特别涉及到使用EDK2 SDK和VS2012的UEFI驱动程序,所以我在这个背景下回答了。如果我们把这个短语从问题的背景中拿出来看,没错,你是对的。不过,你仍然需要一个包含从EDK2树中获取的头文件的环境(在你的情况下是gnu-efi),我自己就是用这样一个自定义树构建了EFI组件。顺便说一句,你的EfiFs驱动程序看起来不像是一个EDK2组件(比如没有INF文件),它也没有链接到任何EDK2库,比如问题中的UefiLib.lib,也没有使用EDK2的构建工具。 - sun2sirius
啊,我的错。我以为 OP 正试图在不使用 EDK2 的情况下使用 VS 构建 EFI 驱动程序,并且遇到了问题。 - Akeo
我正在使用VS2008构建EDK2 UEFI应用程序/驱动程序/库。是否可以使用VS2015构建相同的内容? - Keshava GN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接