【问题标题】:Building UEFI driver using Visual Studio使用 Visual Studio 构建 UEFI 驱动程序
【发布时间】:2014-02-28 07:47:15
【问题描述】:

我正在寻找有关如何使用 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 存在于 lib 中,但它不是作为导出或导入存在,而是作为存档成员存在。不知道是不是这个问题。

【问题讨论】:

    标签: c visual-studio boot efi uefi


    【解决方案1】:

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

    在 Visual Studio 中,您可以从创建 Makefile 项目开始 - 这是指定所有自定义构建步骤所必需的。例如,转到项目的属性页,在配置属性 -> NMake -> 常规 -> 构建命令行下。将以下代码放入构建命令行;它将允许您构建整个 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 来获得其强大的 IntelliSense 和调试功能。为此,您应该从构建 Nt32Pkg 程序包开始,它会在 Windows 中创建 EFI 模拟环境,并允许您单步调试代码并将 UEFI 驱动程序/应用程序作为常规 Windows 应用程序进行调试。设置一个 Visual Studio 项目来执行此操作有点棘手,除非您使用专门的 VS 扩展进行 UEFI 开发,为您自动完成所有这些工作,例如 Phoenix Core Architect。但是,也可以手动进行,您只需手动将 EDK2 源的部分或全部文件/文件夹结构带入 VS 解决方案资源管理器。 Nt32Pkg 构建的结果是 Windows 应用程序 C:\src\edk2\Build\NT32IA32\DEBUG_VS2012x86\IA32\SecMain.exe - 它应该让您在 Windows 环境中开始并介绍 UEFI。

    【讨论】:

    • “您不能单独构建 UEFI 驱动程序或应用程序,它必须在 EDK2 源代码树中完成” - 这不是真的。我正在使用 Visual Studio 2015 构建 UEFI 文件系统驱动程序,没有 EDK2,github.com/pbatard/efifs。您所需要的只是将 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 构建相同的?
    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2013-08-01
    • 2014-10-29
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多