问题描述
我正在尝试使用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) \
...