MSVC 手动链接 stdlib

MSVC Manually Linking stdlib

提问人:Dalex 提问时间:3/29/2021 更新时间:4/1/2021 访问量:440

问:

目前,我正在尝试在我的 EDK2 项目中使用 C 标准库。 由于我的 Visual Studio 2019 没有自动添加必要的包含目录, 我手动将以下文件夹添加到我的包含目录:

C:\edk2\MdePkg\Include\X64
C:\edk2\MdePkg\Include
C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.28.29812\include
C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.28.29812\atlmfc\include
C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Auxiliary\VS\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\winrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\cppwinrt
C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\Include\um

由于这修复了我丢失的 #include 指令,我唯一剩下的就是手动 将缺少的库添加到链接器参数中。

我这样做如下:

1.) 经过快速的 Google 搜索,我发现,我必须将我的应用程序链接到 libucrt.lib,然后我试图通过执行简单的搜索在我的 Windows 10 SDK 中找到它,这给了我以下结果:

C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64

因此,我将此目录添加到 Visual Studio 2019 中的库目录中。 别忘了,我还添加了 libucrt.libLinker Libraries

我的问题是,在编译我的项目后,我仍然从链接器收到错误:Linker error

我已经尝试使用不同的包含目录以及不同的 Windows SDK 版本, 但似乎没有一个能解决我的问题。

我很感激任何形式的帮助,谢谢。

C visual-Studio std UEFI EDK2

评论

1赞 user123 3/29/2021
我不完全确定你想做什么,但UEFI是一个固件接口。您不会“手动将 C 标准”链接到 UEFI 应用程序。在 EFI 引导加载程序中,您根本没有执行 C 标准库所需的系统调用(中断)所需的操作系统 API。当您与 Windows 提供的库静态链接时,将包括系统调用之前的所有代码。这就是静态链接受到限制的地方。无论您多么努力,都无法将中断代码包含在静态链接程序中。
0赞 user123 3/29/2021
在 C 语言中进行的大多数标准库调用都有自己的 EDK2 版本。您可以改用这些版本,也可以简单地自己实现这些函数,这通常是微不足道的。

答:

0赞 Dalex 4/1/2021 #1

我决定按照@user123的建议,自己实现 stdlib 中所需的功能,以解决此问题并节省大量时间。