Я пытаюсь создать уникальный дескриптор для объекта vk::DebugUtilsMessengerEXT
.
Для этого я загрузил VkCreateDebugUtilsMessenger()
в указатель функции, а затем вызвал его, чтобы создать простую структуру C, которую я затем превращаю в уникальный объект vulkan.hpp через
vk::UniqueDebugUtilsMessengerEXT(messenger, instance);
Вот тут и начинается проблема. Этот тип объекта неявно вызывает деструктор, то есть он пытается вызвать vkDestroyDebugUtilsMessengerEXT
, когда переменная покидает область действия. Однако эту функцию нельзя загрузить в указатель с тем же именем.
т.е. определение указателя функции как vkDestroyDebugUtilsMessengerEXT
А затем установить его как
vkDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT) instance.getProcAddr(
"vkDestroyDebugUtilsMessengerEXT");
Приводит к ошибке компиляции, поскольку я переопределяю символ.
error: ‘void (* vkDestroyDebugUtilsMessengerEXT)(VkInstance, VkDebugUtilsMessengerEXT, VkAllocationCallbacks)’ redeclared as different kind of symbol
Однако его определение не вызывает ошибку компоновщика, так как компоновщик не может найти символ, с которым нужно связать для уничтожения уникального дескриптора.
/usr/bin/ld: obj/Debug/main.o: in function `vk::DispatchLoaderStatic::vkDestroyDebugUtilsMessengerEXT(VkInstance_T*, VkDebugUtilsMessengerEXT_T*, VkAllocationCallbacks const*) const':
/home/kronos/Desktop/Vulkan/Generated/../libraries/vulkansdk-linux/1.1.97.0/x86_64/include/vulkan/vulkan.hpp:1770: undefined reference to `vkDestroyDebugUtilsMessengerEXT'
Как мне обойти это? Как я могу выставить этот символ для компиляции?