0

一种方法如何添加对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 版本。

4

1 回答 1

0

我能够使用以下针对 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

你好ç

#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 中所做的那样

于 2022-02-21T07:56:32.667 回答