ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: это ошибка компилятора / компоновщика в TDM_GCC. Смотри ответ.
РЕДАКТИРОВАТЬ: Это не дубликат, насколько я могу сказать. Проблема заключается в простой ошибке noob, но это не так. Я связался с правильной библиотекой Vulkan «vulkan-1.lib», используя TDM-GCC-64, которая является инструментарием GCC / MinGW для окон, и использовал пример кода из примеров VulkanSDK. Эта страница Как я могу использовать Vulkan с MinGW? (Ошибка R_X86_64_32) также подтверждает, что он может работать на MinGW, который не должен отличаться от TDM-GCC-64, поскольку он использует части MinGW. Если это дубликат с простым ответом, то я прошу прощения за вопрос, но до сих пор никто не решил эту «простую» проблему.
EDIT2: вот мои файлы проекта. Просто отредактируйте make-файл, как вам нужно, и запустите «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
Мой make-файл выглядит так:
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
Что я делаю неправильно? Я связываю agaist с нужной библиотекой, верно?
Вот мой программный код:
#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
Как я выяснил, (благодаря @Gomiero), если я попробую эту же сборку с posG seh rev0 MinGW-w64 x86_64, она будет работать отлично! Похоже, что TDM-GCC-64, а также обычные MinGW имеют проблемы с библиотекой «vulkan-1». Итак, в итоге это ошибка компилятора / компоновщика!
В большинстве случаев неопределенная ссылка появляется, когда вы забыли связать библиотеку.
Компилятор может видеть определение благодаря заголовочному файлу, но для создания исполняемого файла он должен иметь эфир или исходники или двоичный файл (.o, .obj, .a, .dll, .so, … ) связать с ним.
Когда этот файл отсутствует, он не может видеть определение.
Это то, что означает неопределенная ссылка.
Обратите также внимание на одну вещь, которую я вижу, вы находитесь на 32-битном компьютере (-m32 == 32-битный компьютер), обязательно соединитесь с 32-битной версией библиотеки Vulkan.