windows - 如何链接 API 集 (*ms-win*) 而不是 kernel32.dll、ntdll.dll 等?

gol*_*sky 3 c++ windows winapi linker visual-studio-2015

如何显式指定MSVC编译器/链接器来链接API 集*ms-win*模式匹配 dll)而不是kernel32.dllntdll.dll等?

例如,我创建了一个简单的 dll,它只调用一些基本的 WinAPI。当检查它的 IAT (通过CFF Explorer、 python pefile库等)时,只有kernel32.dll。我希望看到的是*ms-win* dll。

Chu*_*urn 5

API 集在内部使用,这意味着即使是 Windows 7、8 或 10 上的“传统”系统 DLL 也会使用它们。因此,您没有理由需要直接使用它们。

也就是说,您可以使用许多“umbrella”库,而不是链接到 classicKERNEL32.DLL等:

  • onecore.lib
  • onecoreuap.lib
  • onecore_apiset.lib

请记住,这些旨在与它们附带的 Windows 10 SDK 相同的 Windows 版本相匹配(即它们向前兼容,而不是向后兼容)。还有一些*_downlevel.lib版本支持旧版本的 Windows。这些主要供驱动程序开发人员根据Microsoft Docs使用

UWP 应用程序使用自己的伞库WindowsApps.lib/ WindowsApps_downlevel.lib.

有关伞形库的更多信息,请参阅Microsoft Docs

请注意,您不应链接多个伞形库,也不应在同一链接中将 kernel32.lib 与伞形库混合在一起。对于WindowsApps.lib. VS 2022 17.2 中的一项改进可以解决这个问题。请参阅此 VS 反馈问题

另外,由于 Microsoft Visual C/C++ 运行时的一个怪癖,如果您使用 链接,您也onecore_apiset.lib应该使用。/IGNOREDEFAULTLIB:onecore.lib /IGNOREDEFAULTLIB:kernel32.lib使用/SUBSYSTEM:WINDOWS,10.0or也是一个好主意/SUBSYSTEM:CONSOLE,10.0。请参阅此 VS 反馈问题