C 使用VisualStudio构建UEFI驱动程序

C 使用VisualStudio构建UEFI驱动程序,c,visual-studio,boot,efi,uefi,C,Visual Studio,Boot,Efi,Uefi,我正在寻找有关如何使用VisualStudio2012项目使用EDK2SDK构建UEFI驱动程序的建议。我试图静态链接UefiLib.lib,但失败得很惨。我已将库添加到链接器下的其他依赖项中 #include <Uefi.h> #include <Library/UefiLib.h> EFI_STATUS EFIAPI UefiMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *Sy

我正在寻找有关如何使用VisualStudio2012项目使用EDK2SDK构建UEFI驱动程序的建议。我试图静态链接UefiLib.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;
}

现在我已经使用了DUMPBIN来确保Print存在于lib中,但是它不是作为导出或导入存在的,而是作为archivemember存在的。我不确定这是否是问题所在。

您不能单独构建UEFI驱动程序或应用程序,它必须在EDK2源代码树中完成,EDK2源代码树包含大量编译和链接EDK2组件所需的头文件和库。EDK2组件必须使用EDK2构建工具构建,C编译器/链接器只是EDK2构建过程中的一个步骤。您应该从使用命令行进行构建开始,以确保环境设置正确,然后可以尝试将要开发的组件引入到VisualStudio中

在Visual Studio中,您可以从创建Makefile项目开始—这是指定所有自定义生成步骤所必需的。例如,转到项目的属性页,在Configuration Properties->NMake->General->Build命令行下。将以下代码放入Build命令行中;它将允许您构建整个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手册


上述步骤应该可以帮助您开始在VisualStudio中构建UEFI应用程序/驱动程序,但您可能希望使用VisualStudio强大的IntelliSense和调试功能。要做到这一点,您应该从构建Nt32Pkg包开始,该包在Windows中创建EFI模拟环境,并允许您逐步完成代码并作为常规Windows应用程序调试UEFI驱动程序/应用程序。设置一个VisualStudio项目来实现这一点有点棘手,除非您为UEFI开发使用一个专门的VS扩展,它可以为您自动化所有这些工作,例如Phoenix Core Architect。但是,也可以手动操作,您只需手动将EDK2源文件/文件夹结构的一部分或全部带到VS解决方案资源管理器中即可。Nt32Pkg构建的结果是Windows应用程序C:\src\edk2\build\NT32IA32\DEBUG\u VS2012x86\IA32\SecMain.exe-这应该让您在Windows环境中开始并了解UEFI。

“您不能单独构建UEFI驱动程序或应用程序,它必须在edk2源代码树中完成”-这不是真的。我正在使用Visual Studio 2015构建UEFI文件系统驱动程序,不使用EDK2。你所需要的只是gnu efi作为一个子模块。这个问题是专门关于带有EDK2 SDK和VS2012的UEFI驱动程序的,所以我在这个上下文中回答了这个问题。如果我们把这个短语从问题的上下文中去掉,当然,你是对的。您仍然需要一个具有取自EDK2树的头的环境(在您的例子中是gnu efi),我自己在这样一个自定义树中构建了efi组件。顺便说一句,您的EfiFs驱动程序看起来不像EDK2组件(例如,没有INF文件),并且它没有链接到任何EDK2库,例如问题中的UefiLib.lib,也没有使用EDK2构建工具。啊,我的错。我以为OP试图使用VS构建EFI驱动程序而不必使用EDK2,但在这样做时遇到了问题。我正在使用VS2008构建EDK2 UEFI应用程序/驱动程序/库。是否可以使用VS2015构建相同的应用程序?
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