2016-02-25 2 views
4

FINAL EDIT: Это ошибка компилятора/компоновщика с TDM_GCC. См. Ответ.Неопределенная ссылка на vkCreateInstance

EDIT: Это не дубликат, насколько я могу судить. Проблема заключается в простой ошибке noob, но это не так. Я связал с правильной библиотекой Vulkan «vulkan-1.lib», используя TDM-GCC-64, который является набором инструментов GCC/MinGW для Windows, и использовал примерный код из примеров VulkanSDK. Эта страница How do I use Vulkan with MinGW? (R_X86_64_32 error) также подтверждает, что она может быть запущена на MinGW, которая не должна отличаться от TDM-GCC-64, поскольку она использует части MinGW. Если это дубликат с простым ответом, то я прошу прощения за вопрос, но пока никто не решил эту «простую» проблему.

EDIT2: Вот мои файлы проекта. Просто отредактируйте файл makefile, но вам нужно и запустите «BUILD.bat». http://www.filedropper.com/vulkanapp_1

Я загрузил LunarG Vulkan SDK v1.0.3.1 и установил его. У меня очень простая программа, которая пытается создать экземпляр Vulkan и выходы.

выход я получаю, когда я пытаюсь построить программу с г ++ является:

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

Моя Makefile выглядит следующим образом:

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 
+0

Вы уверены, что библиотека в bin была создана для MinGW? (Кажется, вы используете mingw) – SergeyA

+0

'\ Bin32' вы на 32 или 64? – iksemyonov

+0

Я использую 64-битный ПК с Windows 7 64 бит, но я создаю 32-битный исполняемый файл. Я использую MinGW, или, точнее, я использую TDM-GCC-64 , а флаг «-m32» - для 32-битного. Если библиотека не была построена для MinGW, то я думаю, что я дерьмо из-за удачи, потому что это единственное, что у них есть. – SeanRamey

ответ

2

Как я узнал (спасибо @Gomiero), если я попробую эту же сборку с MinGW-w64 x86_64 posix seh rev0, она будет работать отлично! Кажется, что TDM-GCC-64, а также обычные MinGW имеют проблемы с библиотекой «vulkan-1». Таким образом, это суммируется как ошибка компилятора/компоновщика!

0

Большая частью времени неопределенные ссылки приходят, когда вы забыли связать библиотеку. Компилятор может видеть определение благодаря файлу заголовка, но для создания исполняемого файла ему необходимо иметь эфир или источники или двоичные файлы (.o, .obj, .a, .dll, .so, .. .) для связи с ним. Если этого файла нет, он не может видеть определение. Это то, что не определено. Обратите внимание на то, что я вижу, что вы на 32-битном компьютере (-m32 == machine 32 bits) обязательно свяжетесь с 32-битной версией библиотеки Vulkan.

+1

Я знаю, что означает неопределенная ссылка ... Я хочу знать, почему она не может найти функцию, которую я ей даю! Насколько я знаю, я связываю его с правильной библиотекой, но документация оставляет желать лучшего. Фактически, в основном нет документации для библиотек. Кроме того, вы можете читать вообще ??? "-LC: \ VulkanSDK \ 1.0.3.1 \ Bin32 -lvulkan-1" – SeanRamey

Смежные вопросы