未定义对vkCreateInstance的引用

Undefined reference to vkCreateInstance

本文关键字:引用 vkCreateInstance 未定义      更新时间:2023-10-16

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库。