首页 > 解决方案 > Vulkan 的静态和动态链接有什么区别,vkGetInstanceProcAddress 的作用有什么不同?

问题描述

由于我已经阅读了一些基本的 Vulkan 教程,因此我遇到了 linink Vulkan 的两种可能性 - 静态(使用 vulkan-1.lib/a)和动态(使用 vulkan-1.dll/so),教程通常说没有区别这两种可能性之间,但真的是这样吗?

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

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

标签: vulkan

解决方案


两者都是动态\运行时链接。这*.lib只是一个为您执行 dll 链接的存根实现,这不是 Vulkan 特有的,而是 Visual C++ 编译器提供的。

带有“静态链接”的官方加载器加载核心命令和基本的本机 WSI 扩展,并保留未加载\未导出的其余部分。直接使用*.dll意味着您需要以特定于操作系统的方式加载 dll,然后vkGetInstanceProcAddr以特定于操作系统的方式提取,然后使用vkGetInstanceProcAddr.

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


推荐阅读