如何正确设置VkDebugUtilsMessengerEXT?

R. *_*yth 3 c++ linker-errors undefined-reference vulkan

我尝试使用多种方法让它发挥作用,无论我不断得到什么:

/usr/local/include/vulkan/vulkan.hpp:2453: undefined reference to `vkCreateDebugUtilsMessengerEXT'

/usr/local/include/vulkan/vulkan.hpp:2548: undefined reference to `vkDestroyDebugUtilsMessengerEXT'
Run Code Online (Sandbox Code Playgroud)

这是我目前拥有的(希望这是足够的代码来诊断问题)

// destroy and create funcs
PFN_vkCreateDebugUtilsMessengerEXT pfnVkCreateDebugUtilsMessengerEXT;
PFN_vkDestroyDebugUtilsMessengerEXT pfnVkDestroyDebugUtilsMessengerEXT;

VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pMessenger)
{
  return pfnVkCreateDebugUtilsMessengerEXT(instance, pCreateInfo, pAllocator, pMessenger);
}

VKAPI_ATTR void VKAPI_CALL vkDestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT messenger, VkAllocationCallbacks const * pAllocator)
{
  return pfnVkDestroyDebugUtilsMessengerEXT(instance, messenger, pAllocator);
}
Run Code Online (Sandbox Code Playgroud)
// instance creation stuff here ...
createUniqueInstance(...);
//


// init and setup debug utils messenger
    pfnVkCreateDebugUtilsMessengerEXT = reinterpret_cast<PFN_vkCreateDebugUtilsMessengerEXT>(
        instance->getProcAddr("vkCreateDebugUtilsMessengerEXT"));
    if (!pfnVkCreateDebugUtilsMessengerEXT) {
        exit_(1, "GetInstanceProcAddr: Unable to find pfnVkCreateDebugUtilsMessengerEXT function.");
    }

    pfnVkDestroyDebugUtilsMessengerEXT = reinterpret_cast<PFN_vkDestroyDebugUtilsMessengerEXT>(
        instance->getProcAddr("vkDestroyDebugUtilsMessengerEXT"));
    if (!pfnVkDestroyDebugUtilsMessengerEXT) {
        exit_(1, "GetInstanceProcAddr: Unable to find pfnVkDestroyDebugUtilsMessengerEXT function.");
    }


    vk::DebugUtilsMessageSeverityFlagsEXT severityFlags(
        vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning |
        vk::DebugUtilsMessageSeverityFlagBitsEXT::eError);
    vk::DebugUtilsMessageTypeFlagsEXT messageTypeFlags(
        vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral |
        vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance |
        vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
    debugUtilsMessenger = instance->createDebugUtilsMessengerEXTUnique(vk::DebugUtilsMessengerCreateInfoEXT(
        {}, severityFlags, messageTypeFlags, &vk::su::debugUtilsMessengerCallback));
Run Code Online (Sandbox Code Playgroud)

// 注意 vk::su::debugUtilsMessengerCallback 来自这里: https: //github.com/KhronosGroup/Vulkan-Hpp/blob/master/samples/utils/utils.hpp

“createUniqueInstance”函数也或多或少地源自上面文件中的 createInstance 函数。不过,没有任何修改会对debug utils Messenger 的内容产生任何影响。

我做错了什么,我不断收到链接器错误。

Sas*_*ems 5

这是由vulkan.hppC++ 头文件引起的。它假设所有函数都存在,但扩展函数(不是核心的一部分)的情况并非如此。因此,您需要将动态调度程序传递给信使回调创建函数。

我没有使用vulkan.hpp自己,但在你的情况下它应该看起来像这样:

debugUtilsMessenger = instance->createDebugUtilsMessengerEXTUnique(vk::DebugUtilsMessengerCreateInfoEXT(
    {}, severityFlags, messageTypeFlags, &vk::su::debugUtilsMessengerCallback), nullptr, vk::DispatchLoaderDynamic{ *instance });
Run Code Online (Sandbox Code Playgroud)

注意vk::DispatchLoaderDynamic作为最后一个参数传递的。

有关详细信息,请参见此处