4

最终编辑:这是 TDM_GCC 的编译器/链接器错误。见答案。

编辑:据我所知,这不是重复的。问题似乎是一个简单的菜鸟错误,但事实并非如此。我已经使用 TDM-GCC-64(Windows 的 GCC/MinGW 工具包)链接到正确的 Vulkan 库“vulkan-1.lib”,并使用了 VulkanSDK 示例中的示例代码。本页如何将 Vulkan 与 MinGW 一起使用?(R_X86_64_32 错误)还确认它可以在 MinGW 上运行,这与 TDM-GCC-64 应该没有什么不同,因为它使用了 MinGW 的一部分。如果这是一个简单答案的重复,那么我很抱歉问,但到目前为止没有人解决这个“简单”问题。

EDIT2:这是我的项目文件。只需根据需要编辑生成文件并运行“BUILD.bat”。http://www.filedropper.com/vulkanapp_1

我已经下载并安装了 LunarG Vulkan SDK v1.0.3.1。我有一个非常简单的程序,它试图创建一个 Vulkan 实例并退出。

当我尝试使用 g++ 构建程序时得到的输出是:

C:\VulkanSDK\1.0.3.1\Bin32/vulkan-1.lib: error adding symbols: File in wrong format collect2.exe: error: ld returned 1 exit status

我的生成文件如下所示:

VulkanApp: main.obj g++ -m32 -LC:\VulkanSDK\1.0.3.1\Bin32 main.obj -o VulkanApp.exe -lvulkan-1 main.obj: main.cpp g++ -m32 -IC:\VulkanSDK\1.0.3.1\Include -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 ICD\n";
        exit(-1);
    } else if (res) {
        std::cout << "unknown error\n";
        exit(-1);
    }

    vkDestroyInstance(inst, NULL); // <- undefined reference here

    return 0;
}
#endif
4

2 回答 2

2

正如我所发现的(感谢@Gomiero),如果我尝试使用 MinGW-w64 x86_64 posix seh rev0 进行相同的构建,它将完美运行!似乎 TDM-GCC-64 以及常规的 MinGW 都存在“vulkan-1”库的问题。所以,这被归结为一个编译器/链接器错误!

于 2016-02-26T08:42:10.203 回答
0

大多数时候,当您忘记链接库时,会出现未定义的引用。由于头文件,编译器能够看到定义,但是要创建可执行文件,它需要有以太或源或二进制文件(.o、.obj、.a、.dll、.so、... ) 与它链接。当此文件不存在时,它看不到定义。这就是未定义参考的意思。还要注意一件事,我看到您使用的是 32 位计算机(-m32 == 机器 32 位),请务必链接 32 位版本的 Vulkan 库。

于 2016-02-25T14:02:06.420 回答