问题描述
说明
目前,我的程序在MSVC上运行没有任何问题,但在MinGW glfwCreateWindowSurface(...)
上却奇怪地抛出了一个错误,即它缺少VK_KHR_win32_surface
扩展名。
表面代码
void createSurface() {
if (glfwCreateWindowSurface(instance,window,nullptr,&surface) != VK_SUCCESS) {
throw std::runtime_error("failed to create window surface!");
}
}
其他信息
-
vkGetInstanceProcAddr(...,"vkCreateWin32SurfaceKHR")
和glfwGetInstanceProcAddress(...,"vkCreateWin32SurfaceKHR")
:返回非null函数指针 -
glfwGetError(...)
:返回65542
和Win32: Vulkan instance missing VK_KHR_win32_surface extension
-
vkEnumerateInstanceExtensionProperties(...)
:列出VK_KHR_win32_surface
扩展名 -
glfwCreateWindowSurface(...)
:返回VK_ERROR_EXTENSION_NOT_PRESENT
-
glfwVulkanSupported()
:返回1 - 它应该与https://vulkan-tutorial.com/code/26_depth_buffering.cpp相同的代码
解决方法
使用GLFW Native可以修复,因为它可以工作:
#define GLFW_EXPOSE_NATIVE_WIN32
#include <GLFW/glfw3native.h>
// ...
VkWin32SurfaceCreateInfoKHR surfaceInfo {};
surfaceInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
surfaceInfo.hinstance = GetModuleHandle(nullptr);
surfaceInfo.hwnd = glfwGetWin32Window(window);
if (vkCreateWin32SurfaceKHR(instance,&surfaceInfo,nullptr,&surface) != VK_SUCCESS) {
throw std::runtime_error("failed to create window surface!");
}
,
您是否有机会拥有更老的glfw?
我在{strong> glfw3 中有glfwCreateWindowSurface
。
我用MinGW-w64在源文件的MSYS2 shell中自己构建了glfw3(静态库和共享库) http://downloads.sourceforge.net/project/glfw/glfw/3.3.2/glfw-3.3.2.tar.bz2使用以下命令:
cmake.exe -G"MSYS Makefiles" -DCMAKE_INSTALL_PREFIX:PATH=$INSTALLPREFIX -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=OFF -DGLFW_BUILD_EXAMPLES:BOOL=OFF -DGLFW_BUILD_TESTS:BOOL=OFF -S. -Bbuild_static &&
cmake.exe -G"MSYS Makefiles" -DCMAKE_INSTALL_PREFIX:PATH=$INSTALLPREFIX -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=ON -DGLFW_BUILD_EXAMPLES:BOOL=OFF -DGLFW_BUILD_TESTS:BOOL=OFF -S. -Bbuild_shared &&
make -Cbuild_static install/strip &&
make -Cbuild_shared install/strip &&
echo Success
,
确保您的应用程序为目标平台使用了正确的Vulkan库。因此,使用针对Windows的MinGW,您可能需要手动针对vulkan-1.dll
进行链接。