代码之家  ›  专栏  ›  技术社区  ›  Makogan

瓦肯。用于扩展的hpp独特手柄

  •  0
  • Makogan  · 技术社区  · 6 年前

    我正在尝试为一个 vk::DebugUtilsMessengerEXT 对象

    为此,我加载了 VkCreateDebugUtilsMessenger() 转换为函数指针,然后调用它来创建普通的C结构,然后我将其转换为一个独特的vulkan。hpp对象通过

    vk::UniqueDebugUtilsMessengerEXT(messenger, instance);

    这就是问题的开始。这种对象隐式地调用析构函数,也就是说它将尝试调用 vkDestroyDebugUtilsMessengerEXT 当变量离开作用域时。但是,不能将此函数加载到具有相同名称的指针中。

    i、 将函数指针定义为 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'
    

    我该怎么解决这个问题?如何公开该符号以进行编译?

    1 回复  |  直到 6 年前
        1
  •  4
  •   C0nstexpr    5 年前

    除了向上的答案,它可能更好地像下面的代码:

    using unique_debug_utils_messenger_ext = UniqueHandle<DebugUtilsMessengerEXT, DispatchLoaderDynamic>;
    ...
    UniqueInstance instance_{nullptr};
    UniqueDevice device_;
    unique_debug_utils_messenger_ext debug_messenger_;
    DebugUtilsMessengerCreateInfoEXT debug_messenger_create_info;
    DispatchLoaderDynamic dispatch_loader_dynamic_;
    ...
    dispatch_loader_dynamic_ = {*instance_, *device_};
    debug_messenger_ = instance_->createDebugUtilsMessengerEXTUnique(
                debug_messenger_create_info,
                nullptr,
                dispatch_loader_dynamic_);
    

    该代码允许您仍然使用智能指针功能。vulkan中的DispatchLoaderDynamic实现中提供了更多详细信息。水电站。

        2
  •  0
  •   Makogan    6 年前

    我找到了解决办法。

    定义一个与请求函数同名的函数,并在其中调用指针,就可以进行编译和链接。

    本质上:

    void (*vkDestroyDebugUtilsMessenger)(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator);
    void vkDestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator)
    {
        vkDestroyDebugUtilsMessenger(instance, debugMessenger, pAllocator);
    }
    

    创建衬里和编译所需的符号,并:

    vkDestroyDebugUtilsMessenger =
            (PFN_vkDestroyDebugUtilsMessengerEXT) vkGetInstanceProcAddr(
                instance, "vkDestroyDebugUtilsMessengerEXT");
    

    将正确初始化指针。