Reputation: 185
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.
Upvotes: 3
Views: 4776
Reputation: 5798
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.
Upvotes: 5