如何明确指定MSVC编译器/链接器链接API集(*ms-win*模式匹配dlls(,而不是kernel32.dll、ntdll.dll等。?
例如,我创建了一个简单的dll,它只调用一些基本的WinAPI。当检查它的IAT(通过CFF资源管理器、python pefile库等(时,只有kernel32.dll。我希望看到*ms-win*dll。
neneneba API集在内部使用,这意味着即使是Windows 7、8或10上的"遗留"系统DLL也会使用它们。因此,您没有理由直接使用它们。
也就是说,你可以使用许多"伞形"库,而不是针对经典的KERNEL32.DLL
等进行链接:
- onecore.lib
- onecoreuap.lib
- onecore_apiset.lib
请记住,这些软件旨在与它们附带的Windows 10 SDK匹配相同的Windows版本(即,它们是前向兼容的,而不是后向兼容的(。还有一些*_downlevel.lib
版本也支持旧版本的Windows。根据微软文档,这些主要供驱动程序开发人员使用
UWP应用程序使用自己的伞形库WindowsApps.lib
/WindowsApps_downlevel.lib
。
有关伞形库的详细信息,请参阅Microsoft文档。
请注意,不应链接多个伞形库,也不应在同一链接中将kernel32.lib与伞形库混合。对于
WindowsApps.lib
以外的场景,使用MSBuild默认规则实际上有点困难。VS 2022 17.2对此进行了改进。请参阅此VS反馈问题。
此外,由于Microsoft Visual C/C++运行时的一个怪癖,如果您使用
onecore_apiset.lib
链接,也应该使用/IGNOREDEFAULTLIB:onecore.lib /IGNOREDEFAULTLIB:kernel32.lib
。使用/SUBSYSTEM:WINDOWS,10.0
或/SUBSYSTEM:CONSOLE,10.0
也是一个好主意。请参阅此VS反馈问题。