Неопределенная ссылка на vkCreateInstance

ПОСЛЕДНЯЯ РЕДАКЦИЯ: это ошибка компилятора/компоновщика с TDM_GCC. Смотрите ответ.

РЕДАКТИРОВАТЬ: Насколько я могу судить, это не дубликат. Проблема кажется простой ошибкой нуба, но это не так. Я связался с правильной библиотекой Vulkan «vulkan-1.lib», используя TDM-GCC-64, который представляет собой набор инструментов GCC/MinGW для Windows, и использовал пример кода из примеров VulkanSDK. Эта страница Как использовать Vulkan с МинГВ? (ошибка 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

Что я делаю не так? Я ссылаюсь на правильную библиотеку, верно?

Вот мой программный код:

#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

person SeanRamey    schedule 25.02.2016    source источник
comment
Вы уверены, что библиотека в bin была создана для MinGW? (Кажется, вы используете mingw)   -  person SergeyA    schedule 25.02.2016
comment
\Bin32 тебе 32 или 64?   -  person iksemyonov    schedule 25.02.2016
comment
Я использую 64-битный ПК с 64-битной Windows 7, но я создаю 32-битный исполняемый файл. Я использую MinGW, или, точнее, я использую TDM-GCC-64 ‹tdm-gcc.tdragon. net›, а флаг -m32 — сборка для 32-битной версии. Если библиотека не была создана для MinGW, то я думаю, мне не повезло, потому что у них есть только она.   -  person SeanRamey    schedule 25.02.2016
comment
Кроме того, кажется, что он должен быть совместим с MinGW, потому что я пытался связать 64-битную библиотеку, чтобы убедиться, что попробовал все, и g++ пожаловался, что библиотека несовместима. С 32-битной версией таких проблем нет, так что все должно быть в порядке.   -  person SeanRamey    schedule 25.02.2016
comment
проверьте vulkan SDK, он должен иметь vulkan-1.lib, с которым вы можете связать.   -  person ratchet freak    schedule 25.02.2016
comment
@ratchet Freak Man, вы, люди, действительно не читаете, не так ли? g++ -m32 -LC:\VulkanSDK\1.0.3.1\Bin32 -lvulkan-1 main.obj -o VulkanApp.exe   -  person SeanRamey    schedule 25.02.2016
comment
ВАУ, я хотел бы знать, что мой вопрос проголосовал против! Если вы считаете, что вопрос должен быть отклонен, то вы должны быть готовы опубликовать ответ. Пока мне никто не дал ответа.   -  person SeanRamey    schedule 25.02.2016
comment
comment
Люди смогли связать библиотеку из LunarG SDK с MinGW-w64 (для x86_64). См. это вопросы и ответы   -  person Ivan Aksamentov - Drop    schedule 25.02.2016
comment
На самом деле я просмотрел эту страницу и попробовал ее решение (которое мне не очень подходило), но это совсем не помогло.   -  person SeanRamey    schedule 25.02.2016
comment
@SeanRamey: Если вы считаете, что вопрос должен быть отклонен, тогда вы должны быть готовы опубликовать ответ. Это не то, что означает отрицательный голос. На самом деле, обычно это противоположно тому, что означает отрицательный голос. Прочтите всплывающую подсказку о том, что означают отрицательные голоса.   -  person Nicol Bolas    schedule 25.02.2016
comment
@Nicol Bolas На самом деле, это значит. Просто так, что это может быть не слишком очевидно. Видите ли, если вопрос бесполезен или неясен, тогда на него должен быть ответ, объясняющий, почему он бесполезен или неясен, или иначе на него следует ответить, если это просто неисследованный вопрос, на который есть простой ответ. Видите ли, если это что-то из этого, тогда не должно быть сложно опубликовать ответ, чтобы объяснить.   -  person SeanRamey    schedule 25.02.2016
comment
@SeanRamey: я пытался скомпилировать точно такой же код с теми же конфигурациями (64 бит), что и ответ, который я дал, просто изменив инструменты на TDM-GCC-64 (версия gcc 5.1.0 - tdm64-1), и я могу подтвердить, что это не работа! Компоновщик выдал мне сообщение: ошибка добавления символов: файл в неправильном формате для vulkan-1.lib. Восстановил инструменты на x86_64-posix-seh-rev0 - MinGW, и все снова заработало.   -  person Gomiero    schedule 26.02.2016
comment
@Gomiero Хорошо, значит, вам пришлось использовать MinGW, чтобы он работал?   -  person SeanRamey    schedule 26.02.2016
comment
@SeanRamey: Да, был. Я тестировал с TDM-GCC-64 (прямо сейчас, когда увидел ваши комментарии), и он не распознал формат vulkan-1.lib. Не знаю почему, но поскольку у меня также были проблемы с gfortran TDM для компиляции libOpenBlas, и потребовалось некоторое время, пока я не обнаружил, что это ошибка, я отказался от использования дистрибутива TDM.   -  person Gomiero    schedule 26.02.2016
comment
@Gomiero Хорошо, вау, теперь я использую MinGW, но он все еще не работает. Это дает мне ту же ошибку, что и раньше. Вы используете MinGW или MinGW-w64? Должно ли это иметь значение? И, если можно, не могли бы вы скинуть ссылку с файлом проекта, который работает?   -  person SeanRamey    schedule 26.02.2016
comment
@Gomiero Неважно, я скачал MinGW-w64 x86_64 posix seh rev0, как вы сказали, и он работает отлично! Итак, да, это должно быть ошибка компилятора/компоновщика.   -  person SeanRamey    schedule 26.02.2016
comment
@SeanRamey: Приятно знать, что это сработало! :) Я надеюсь, что кто-то может добавить в ответы более подробную информацию об этой ошибке. Возможно, это поможет большему количеству людей в будущем.   -  person Gomiero    schedule 26.02.2016


Ответы (2)


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

person SeanRamey    schedule 26.02.2016

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

person John_Sharp1318    schedule 25.02.2016
comment
Я знаю, что означает неопределенная ссылка... Я хочу знать, почему она не может найти функцию, которую я ей даю! Насколько я знаю, я связываю его с правильной библиотекой, но документация оставляет желать лучшего. На самом деле, документации по библиотекам вообще НЕТ. А ты вообще читать умеешь??? -LC:\VulkanSDK\1.0.3.1\Bin32 -lvulkan-1 - person SeanRamey; 25.02.2016