Vulkan 的静态链接和动态链接有什么区别,vkGetInstanceProcAddr ess 的作用有何不同?

What is the difference between static and dynamic liniking of Vulkan and how differs the role of vkGetInstanceProcAddress?

因为我已经学习了一些基本的 Vulkan 教程,所以我遇到了 linink Vulkan 的两种可能性——静态(使用 vulkan-1.lib/a)和动态(使用 vulkan-1.dll/so),教程上通常说这两种可能没有区别,但真的是这样吗?

当我必须通过一些 Nvidia 示例并使用他们的扩展加载方式并以某种方式将其合并到我的应用程序中(因为我需要他们的显示扩展支持)时,我的事情开始变得非常混乱 - 现在看来该应用程序现在正在与 .dll 和 .lib 链接。我认为这不好,我正在努力消除它,但对我来说,它揭示了一些我不确定我是否理解正确的东西,即:

我认为我需要调用这个函数以防我想访问 Vulkan api 函数调用,它会通过调度树向我提供指向 ICD 的函数指针。但是为什么我需要再次调用它来访问一些扩展函数(例如验证层),但是一些扩展函数调用如 VkSurfaceKHR 或 VkSwapchianKHR 扩展的方法不需要通过额外调用 vkGetInstanceProcAddr 来访问,为什么会这样,我缺少什么?

两者都在 dynamic\runtime 链接。 *.lib 只是一个存根实现,它为您执行 dll 链接,这不是 Vulkan 特有的东西,而是 Visual C++ 编译器提供的东西。

具有“静态链接”的官方加载器加载核心命令和基本的本机 WSI 扩展并保留其余部分 unloaded\unexported。直接使用*.dll意味着你需要以OS-specific的方式加载dll,然后以OS-specific的方式提取vkGetInstanceProcAddr,然后用[=12加载你需要的一切=].

您可以在 LoaderAndLayerInterface.md 阅读更多内容。