在定义宏以加载vulkan函数指针时,未声明的标识符

问题描述

我正在尝试使用vmake启动vulkan。我目前正在尝试动态加载 使用此example

的vulkan函数指针

在这里,它们使用宏的构造使从vulkan加载器加载所有函数指针更加容易。

现在,当以这种特定方式加载指针时,我遇到了一些问题,我遇到了3个可能密切相关的错误:

error C2065: 'vkGetInstanceProcAddr': undeclared identifier
error C2065: 'PFN_vkGetInstanceProcAddr': undeclared identifier
error C2146: syntax error: missing ';' before identifier 'GetProcAddress'

全部抛出到list_vulkan_functions.inl(5,1)

我发现奇怪的是,在示例中,它们在list_vulkan_functions.inl中不包含任何文件,因此对我来说,它抛出“未声明的标识符”错误似乎是合乎逻辑的,这怎么可能起作用?我已经看到了这种方法的多个示例,所以我肯定做错了什么,但似乎无法弄清楚是什么。

list_vulkan_functions.inl

#ifndef EXPORTED_VULKAN_FUNCTION
#define EXPORTED_VULKAN_FUNCTION( function )
#endif

EXPORTED_VULKAN_FUNCTION( vkGetInstanceProcAddr ) // <--error gets thrown here

#undef EXPORTED_VULKAN_FUNCTION

此文件然后包含在以下文件中: vulkan_functions.h

#ifndef VULKAN_FUNCTIONS_H_
#define VULKAN_FUNCTIONS_H_

#include "vulkan.h"

namespace vulkan_test
{
#define EXPORTED_VULKAN_FUNCTION(name) extern PFN_##name name;
#define GLOBAL_LEVEL_VULKAN_FUNCTION(name) extern PFN_##name name;
#define INSTANCE_LEVEL_VULKAN_FUNCTION(name) extern PFN_##name name;
#define INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION(name,extension) extern PFN_##name name;
#define DEVICE_LEVEL_VULKAN_FUNCTION(name) extern PFN_##name name;
#define DEVICE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION(name,extension) extern PFN_##name name;

#include "list_vulkan_functions.inl"

} // namespace vulkan_test

#endif

vulkan_functions.cpp

#include "vulkan_functions.h"

namespace vulkan_test
{
#define EXPORTED_VULKAN_FUNCTION(name) PFN_##name name;
#define GLOBAL_LEVEL_VULKAN_FUNCTION(name) PFN_##name name;
#define INSTANCE_LEVEL_VULKAN_FUNCTION(name) PFN_##name name;
#define INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION(name,extension) PFN_##name name;
#define DEVICE_LEVEL_VULKAN_FUNCTION(name) PFN_##name name;
#define DEVICE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION(name,extension) PFN_##name name;

#include "list_vulkan_functions.inl"
} // namespace vulkan_test

vulkan_library.cpp

bool vulkan_test::load_vulkan_function(LIBRARY_TYPE const& vulkanLibrary)
{
#define EXPORTED_VULKAN_FUNCTION(name)                                                     \
    name = (PFN_##name)LOAD_FUNCTION(vulkanLibrary,#name);                                \
    if (name == nullptr)                                                                   \
    {                                                                                      \
        std::cout << "Could not load exported Vulkan function named: " #name << "\n";      \
        return false;                                                                      \
    }                                                                                      
                                                                                           
#include "list_vulkan_functions.inl"

    return true;
}

解决方法

确保您的 load_vulkan_function 函数在 vulkan_test 命名空间中声明,并且 vulkan_functions.h 包含在 vulkan_library.cpp 中。

这里的关键是你必须将LOAD_FUNCTION的结果赋给extern变量name(基本上是vulkan_test::vkGetInstanceProcAddr)在vulkan_test中声明命名空间(参见 vulkan_functions.h#8 - 或 Intel's sources):

vulkan_library.cpp

#include "vulkan_functions.h"
...
bool vulkan_test::load_vulkan_function(LIBRARY_TYPE const& vulkanLibrary)
{
#define EXPORTED_VULKAN_FUNCTION(name)                                                   \
    vulkan_test::name = (PFN_##name)LOAD_FUNCTION(vulkanLibrary,#name);                 \
    if (vulkan_test::name == nullptr)                                                    \
    ...

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...