未定义对vkCreateInstance的引用
Undefined reference to vkCreateInstance
FINAL EDIT:这是TDM_GCC的编译器/链接器错误。请参阅答案。
编辑:据我所知,这不是重复的。问题似乎是一个简单的noob错误,但事实并非如此。我已经使用TDM-GCC-64链接到了正确的Vulkan库"Vulkan-1.lib",这是用于windows的GCC/MinGW工具包,并使用了VulkanSDK示例中的示例代码。本页如何将Vulkan与MinGW一起使用?(R_X86_64_32错误(也证实了它可以在MinGW上运行,这应该与TDM-GCC-64没有什么不同,因为它使用了MinGW的一部分。如果这是一个简单答案的重复,那么我很抱歉问,但到目前为止,还没有人解决这个"简单"的问题。
第二版:这是我的项目文件。只需根据需要编辑makefile并运行"BUILD.bat"。http://www.filedropper.com/vulkanapp_1
我已经下载了LunarG Vulkan SDK v1.0.3.1并安装了它。我有一个非常简单的程序,试图创建一个Vulkan实例并退出。
当我尝试用g++构建程序时,我得到的输出是:
C:VulkanSDK1.0.3.1Bin32/vulkan-1.lib: error adding symbols: File in wrong format collect2.exe: error: ld returned 1 exit status
我的生成文件如下:
VulkanApp: main.obj g++ -m32 -LC:VulkanSDK1.0.3.1Bin32 main.obj -o VulkanApp.exe -lvulkan-1 main.obj: main.cpp g++ -m32 -IC:VulkanSDK1.0.3.1Include -c main.cpp -o main.obj clean: del *.exe *.obj
我做错了什么?我正在重新链接正确的库,对吗?
这是我的程序代码:
#include <vulkan/vulkan.h>
//#include <vulkan/vk_sdk_platform.h>
#include <iostream>
#include <cstdlib>
#define APP_SHORT_NAME "VulkanApp"
int main()
{
// initialize the VkApplicationInfo structure
VkApplicationInfo app_info = {};
app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
app_info.pNext = NULL;
app_info.pApplicationName = APP_SHORT_NAME;
app_info.applicationVersion = 1;
app_info.pEngineName = APP_SHORT_NAME;
app_info.engineVersion = 1;
app_info.apiVersion = VK_API_VERSION;
// initialize the VkInstanceCreateInfo structure
VkInstanceCreateInfo inst_info = {};
inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
inst_info.pNext = NULL;
inst_info.flags = 0;
inst_info.pApplicationInfo = &app_info;
inst_info.enabledExtensionCount = 0;
inst_info.ppEnabledExtensionNames = NULL;
inst_info.enabledLayerCount = 0;
inst_info.ppEnabledLayerNames = NULL;
VkInstance inst;
VkResult res;
res = vkCreateInstance(&inst_info, NULL, &inst); // <- undefined Reference here
if (res == VK_ERROR_INCOMPATIBLE_DRIVER) {
std::cout << "cannot find a compatible Vulkan ICDn";
exit(-1);
} else if (res) {
std::cout << "unknown errorn";
exit(-1);
}
vkDestroyInstance(inst, NULL); // <- undefined reference here
return 0;
}
#endif
正如我所发现的,(感谢@Gomiero(,如果我用MinGW-w64 x86_64 posix seh rev0尝试同样的构建,它将完美工作!看来TDM-GCC-64以及常规的MinGW在"vulkan-1"库方面存在问题。所以,这被总结为一个编译器/链接器错误!
大多数时候,当您忘记链接库时,就会出现未定义的引用。由于头文件,编译器能够看到定义,但要创建可执行文件,它需要有以太或源或二进制文件(.o、.obj、.a、.dll、.so、…(才能与之链接。当该文件不存在时,它将看不到定义。这就是未定义引用的含义。还要注意一件事,我看到你在一台32位计算机上(-m32==机器32位(,一定要链接到32位版本的Vulkan库。
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 如何引用基类的派生类?