3

I have tried to get this to work using several methods and no matter what I keep getting:

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

/usr/local/include/vulkan/vulkan.hpp:2548: undefined reference to `vkDestroyDebugUtilsMessengerEXT'

Here is what I currently have (hopefully this is enough code to diagnose the problem)

// 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);
}
// 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));

// note the vk::su::debugUtilsMessengerCallback is from here: https://github.com/KhronosGroup/Vulkan-Hpp/blob/master/samples/utils/utils.hpp

The 'createUniqueInstance' function is also more or less derived from the createInstance func in the file above. there are no modifications that should have any affect the debug utils messenger stuff though.

What am I doing wrong that I keep getting the linker errors.

R. Smyth
  • 175
  • 1
  • 8
  • Are you sure that you're not calling e.g. ```vkCreateDebugUtilsMessengerEXT``` somewhere in your code? Your function is named ```pfnVkCreateDebugUtilsMessengerEXT``` so it seems odd that the error message does not refer to that. For the Khronos sample you're referring too (which was written by me) we're using a dynamic loader (volk) so we can directly access the vk variants without manually loading the function pointers. – Sascha Willems Apr 24 '20 at 05:03
  • No not calling `vkCreateDebugUtilsMessengerEXT` at all. I wonder if maybe I should add volk now. Maybe thats the problem? Although I have tried it other ways without using the `pfnVkCreateDebugUtilsMessengerEXT` instead tried like on https://vulkan-tutorial.com/ – R. Smyth Apr 24 '20 at 05:08

1 Answers1

5

This is caused by the vulkan.hpp C++ header. It assumes that all functions are present, which is not the case for extension functions (that aren't part of the core). So you need to pass a dynamic dispatcher to the messenger callback creation function.

I'm not using vulkan.hpp myself, but it should look something like this in your case:

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

Note the vk::DispatchLoaderDynamic passed as the last parameter.

Details on this can be found here.

Sascha Willems
  • 5,280
  • 1
  • 14
  • 21