Efi 应用程序链接器错误未解析的外部符号 gEfiShellProtocolGuid 在函数 main 中引用

Efi app linker error unresolved external symbol gEfiShellProtocolGuid referenced in function main

我正在尝试通过使用 MS 的 VC 编译器和 MS 的链接器手动编译和 linking 源代码来创建一个 efi 应用程序。

源代码编译正常,但出现 linker 错误:

    error unresolved external symbol gEfiShellProtocolGuid referenced in function main

看来我无法访问 gEfiShellProtocolGuid。

代码:

#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Shell.h>
EFI_STATUS EFIAPI main(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE* SystemTable)
{
    EFI_SHELL_PROTOCOL* efiShellProt;

    SystemTable->BootServices->LocateProtocol(&gEfiShellProtocolGuid, NULL, (VOID**)&efiShellProt);

    CHAR16* cmd = L"ls";
    efiShellProt->Execute(&ImageHandle, cmd, NULL, NULL);

    return EFI_SUCCESS;
}

我假设我收到此错误是因为我在尝试手动编译和 link 上传文件时做错了什么。

这就是我尝试编译它的方式:

cl.exe /Zl /GS- /c  /I"C:\edk2\MdePkg\Include" /I"C:\edk2\MdePkg\Include\Library" /I"C:\edk2\ShellPkg\Include\Protocol" /I"C:\edk2\MdePkg\Include\X64" /I"C:\edk2\MdePkg\Include\Protocol" /I"C:\edk2\ShellPkg\Include\Library" MyProgram.c

这就是我尝试 link 的方式:

link /entry:main /dll /IGNORE:4086 MyProgram.obj

关于如何解决此 linker 错误的任何解决方案?

您可能需要将 gEfiShellProtocolGuid 添加到应用程序 INF 文件的 [Protocols] 部分:

[Protocols]
    gEfiShellProtocolGuid

直接使用 compiler/linker 构建时,您会丢失由 EDKII 工具从 INF 文件自动生成的 AutoGen.c 文件。 AutoGen.c 文件包含 gEfiShellProtocolGuid 等符号的等式和许多其他定义。您可能必须复制这些才能让您的程序完全运行。

您需要在代码中的某处定义所有 guid、pcds 和 start/stop 方法。

从 edk2 构建一个应用程序(例如 efi shell)并在构建文件夹中查看它们的输出(例如 X64\ShellPkg\Application\Shell\Shell\DEBUG)。将有一个 AutoGen.c 和 AutoGen.h,其中包含所有必需符号的定义,您的程序中需要这样的东西(或简单地复制文件)。 如果您需要更多或其他 guid,只需将它们添加到此文件即可。

除了 guid、start/stop 方法和 pcds 之外,您还需要 link 针对某些库,最有可能您需要 BaseLib.lib 和 UefiLib.lib(您可以使用 edk2 构建它们,然后添加对它们的引用)。