【问题标题】:Including edk2-libc in efi shell application在 efi shell 应用程序中包含 edk2-libc
【发布时间】:2021-09-30 07:59:10
【问题描述】:

一种方法如何添加对https://github.com/tianocore/edk2-libc 的支持,比如我想在我的 edk2 应用程序中包含 stdio 并使用 printf?我遵循了 StdLib/Readme.txt,并且能够在 AppPkg 中成功构建示例,但是,当我尝试将 StdLib 添加到我的项目中时,我收到如下错误:

LibString.lib(Searching.obj) : error LNK2005: strspn already defined in LibString.lib(Searching.obj)
LibCtype.lib(CClass.obj) : error LNK2005: isspace already defined in LibCtype.lib(CClass.obj)
(...)
LibC.lib(Main.obj) : error LNK2001: unresolved external symbol main

我确实将样板文件(!包括 StdLib/StdLib.inc)添加到我的 dsc 文件中,在 inf 中,我将 StdLib.dec 添加到 Packages 中,并将 LibC 和 LibStdio 添加到 LibraryClasses 中。我正在使用 VS2017 工具链进行编译,并且正在使用 edk2-stable202108 版本。

【问题讨论】:

    标签: libc uefi edk2


    【解决方案1】:

    我能够使用以下 AppPkg 的 Hello Application 配置来实现这一点。

    你好.inf

    
    [Defines]
      INF_VERSION                    = 0x00010006
      BASE_NAME                      = Hello
      FILE_GUID                      = a912f198-7f0e-4803-b908-b757b806ec83
      MODULE_TYPE                    = UEFI_APPLICATION
      VERSION_STRING                 = 0.1
      ENTRY_POINT                    = ShellCEntryLib
    
    #
    #  VALID_ARCHITECTURES           = IA32 X64
    #
    
    [Sources]
      Hello.c
    
    [Packages]
      MdePkg/MdePkg.dec
      ShellPkg/ShellPkg.dec
      StdLib/StdLib.dec
    
    [LibraryClasses]
      UefiLib
      ShellCEntryLib
      BaseLib
      BaseMemoryLib
      MemoryAllocationLib
      LibStdLib
      LibStdio
      LibString
      DevConsole
    

    你好.c

    #include  <Uefi.h>
    #include  <Library/UefiLib.h>
    #include  <Library/ShellCEntryLib.h>
    #include  <stdio.h>
    
    int
    main (
      IN int Argc,
      IN char **Argv
      )
    {
        printf("Hello, world!\n");
        
      return 0;
    }
    

    我的理解是,LibC 中定义了 ShellAppMain(),它在内部调用了 extern main()。所以你需要在你的源代码中提供 main() 的定义,就像我在 Hello.c 中所做的一样

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • 您不必在代码中包含前 3 个标头 - 只需 stdio.h。请参阅github.com/tianocore/edk2-libc/blob/master/AppPkg/Applications/… 的示例代码。您的main.inf 过于复杂,请参阅github.com/tianocore/edk2-libc/blob/master/AppPkg/Applications/…
    • 感谢您的回复。如果我启动到 UEFI Shell 并启动应用程序“Main.efi”,该应用程序将正常运行。但是,当我将引导选项设置为直接引导到 Main.efi 时,它会失败。这使我相信 LibC 对 UEFI Shell 应用程序来说很重要。我确实找到了另一个解决方案wiki.osdev.org/POSIX-UEFI 彻底,我能够编译一个可以直接启动的应用程序。希望 EDK2-LibC 也提供相同的功能。
    猜你喜欢
    • 2021-07-14
    • 1970-01-01
    • 2021-07-06
    • 2017-08-24
    • 2015-12-04
    • 2020-05-27
    • 2016-03-21
    • 2011-11-07
    • 2020-11-11
    相关资源
    最近更新 更多