vulkan - Vulkan 的静态和动态链接有什么区别,vkGetInstanceProcAddress 的作用有什么不同?
问题描述
由于我已经阅读了一些基本的 Vulkan 教程,因此我遇到了 linink Vulkan 的两种可能性 - 静态(使用 vulkan-1.lib/a)和动态(使用 vulkan-1.dll/so),教程通常说没有区别这两种可能性之间,但真的是这样吗?
当我必须通过一些 Nvidia 示例并使用他们的扩展加载方式并以某种方式将其合并到我的应用程序(因为我需要他们的显示扩展支持)时,我的事情开始变得非常混乱 - 现在看来应用程序现在正在链接同时使用 - .dll 和 .lib。我认为这不好,我正试图根除它,但对我来说,它揭示了一些我不完全确定我是否理解正确的东西,即:
- 使用 vkGetInstanceProcAddr 进行动态和静态链接有什么区别?
我认为我需要调用这个函数,以防我想要访问 Vulkan api 函数调用,它会通过调度树为我提供指向 ICD 的函数指针。但是为什么我需要再次调用它来访问一些扩展函数(例如验证层),但是一些扩展函数调用如 VkSurfaceKHR 或 VkSwapchianKHR 扩展的方法不需要通过额外调用 vkGetInstanceProcAddr 来访问,为什么会这样,我错过了什么?
解决方案
两者都是动态\运行时链接。这*.lib
只是一个为您执行 dll 链接的存根实现,这不是 Vulkan 特有的,而是 Visual C++ 编译器提供的。
带有“静态链接”的官方加载器加载核心命令和基本的本机 WSI 扩展,并保留未加载\未导出的其余部分。直接使用*.dll
意味着您需要以特定于操作系统的方式加载 dll,然后vkGetInstanceProcAddr
以特定于操作系统的方式提取,然后使用vkGetInstanceProcAddr
.
您可以在LoaderAndLayerInterface.md阅读更多内容。
推荐阅读
- git - 通过 Github Actions CI/CD 访问服务器时 Git Permission denied (publickey)
- python-3.x - 如何在不同的shell中打开两个py文件
- c# - 是否可以在 C# 中执行“递归参数多态性”
- excel - Excel VBA:如何将范围转换为数字并将列中的输出作为列表
- amazon-redshift - 将子查询连接到另一个红移
- mysql - MYSQL EAV 连接查询优化
- javascript - 在 iframe 中拖放在 Spring 中不起作用
- javascript - LinkError:WebAssembly.instantiate() 函数导入需要可调用
- ios - 未调用 Github 的 Oauth2 的结果回调
- database - 摔跤模拟器实体框架/数据库设计