如何正确加载Vulkan函数?

问题描述 投票:0回答:1

这是我的一个小代码片段。问题是我想加载“createDebugUtilsMessengerEXT”函数。但我收到链接错误:

LNK2001:无法解析的外部符号“class vk::DispatchLoaderDynamic vk::defaultDispatchLoaderDynamic”。

我到底做错了什么?

另外,我根据这个例子

编写了这段代码
#include <vulkan.hpp>
#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1

#ifdef VALIDATION_LAYERS
    VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
                                                 VkDebugUtilsMessageSeverityFlagsEXT messageType,
                                                 const VkDebugUtilsMessengerCallbackDataEXT* pCallBackData,
                                                 void* pUserData)
    {
        std::cerr << "Validation: " << pCallBackData->pMessage << std::endl;
        return VK_FALSE;
    }
#endif

vk::Instance createInstance()
{
    ...
#ifdef VALIDATION_LAYERS
        debugMessengerCreateInfo_ = vk::DebugUtilsMessengerCreateInfoEXT({},
                                                                         vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning | vk::DebugUtilsMessageSeverityFlagBitsEXT::eError,
                                                                         vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance,
                                                                         debugCallback);
#endif

        vk::Instance instance = vk::createInstance(instanceCreateInfo);

#ifdef VALIDATION_LAYERS
        VULKAN_HPP_DEFAULT_DISPATCHER.init(instance);
        debugMessenger_ = instance.createDebugUtilsMessengerEXT(debugMessengerCreateInfo_);
    #endif
c++ vulkan unresolved-external
1个回答
0
投票

您需要

#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 
之前加载 Vulkan.hpp。来自vulkan.hpp

要使用

vk::DispatchLoaderDynamic
作为默认调度程序(意味着:您不需要将其显式添加到每个函数调用中),您需要
#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1
,并在源代码中使用宏
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE
一次为默认调度程序提供存储。然后就可以通过宏来使用了
VULKAN_HPP_DEFAULT_DISPATCHER

© www.soinside.com 2019 - 2024. All rights reserved.