c++ - 未声明的标识符,在定义宏以加载 vulkan 函数指针时
问题描述
我正在尝试让 vulkan 启动并使用 cmake 运行。我目前正在尝试使用此示例动态加载 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
(基本上是) (参见- 或Intel 的来源):vulkan_test::vkGetInstanceProcAddr
vulkan_test
vulkan_functions.h#8
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) \
...
推荐阅读
- sql - 在 MS ACCESS 中使用 SELF JOIN 对多列求和
- snowflake-cloud-data-platform - Snowflake 是否在集群中的多个节点或单个节点上执行“单个”单个查询?
- css - 下拉导航
- c# - C#格式双重限制有效数字但限制科学记数法
- javascript - 在 Javascript 中查询深层嵌套元素
- python - 从 df.describe 中提取最高值,然后放入图中
- android - Android:将应用注册为双屏手机的游戏手柄输入设备
- python - 如何用 pandas 将句子拆分为句子 ID、单词和标签?
- laravel - Laravel Api 返回 Html 而不是 json
- reactjs - 将值传递给按钮单击事件