Я пытаюсь настроить программу для использования Vulkan. Я установил LunarG SDK. У меня есть крошечная программа, которая в основном просто вызывает vkCreateInstance
, Я скомпилировал эту строку:
g++ -std=c++11 -I/c/VulkanSDK/1.0.3.1/Include -L/c/VulkanSDK/1.0.3.1/Bin main.cpp -lvulkan-1
Я получаю эту ошибку компилятора, используя 64-разрядный MINGW (MSYS2):
relocation truncated to fit||R_X86_64_32 against symbol `__imp_vkCreateInstance' defined in .idata$5 section in C:\VulkanSDK\1.0.3.1\Bin/vulkan-1.lib(vulkan-1.dll.b)|
Что я делаю? Я ссылаюсь на нужную библиотеку?
Я смог скомпилировать простую программу, просто позвонив vkCreateInstance
с MinGW-64
,
Возможно, ошибка, которую вы получаете, связана с -m64
флаг.
Следуйте ниже моей конфигурации:
С g ++:
Обобщение:
g++ -m64 -std=c++11 -c -g -I/C/VulkanSDK/1.0.3.1/Include -MMD -MP -MF "build/Debug/MinGW-Windows/main.o.d" -o build/Debug/MinGW-Windows/main.o main.c
Ссылка на сайт:
g++ -m64 -std=c++11 -o dist/Debug/MinGW-Windows/vulkanfirsttest build/Debug/MinGW-Windows/main.o -L/C/VulkanSDK/1.0.3.1/Bin -lvulkan-1
С gcc:
Обобщение:
gcc -m64 -c -g -I/C/VulkanSDK/1.0.3.1/Include -std=c11 -MMD -MP -MF "build/Debug/MinGW-Windows/main.o.d" -o build/Debug/MinGW-Windows/main.o main.c
Ссылка на сайт:
gcc -m64 -o dist/Debug/MinGW-Windows/vulkanfirsttest build/Debug/MinGW-Windows/main.o -L/C/VulkanSDK/1.0.3.1/Bin -lvulkan-1
Исходный код:
#include <stdio.h>
#include <stdlib.h>
#include <vulkan/vulkan.h>
int main(int argc, char *argv[]) {
VkInstanceCreateInfo vk_info;
VkInstance inst = 0;
VkResult res;
vk_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
vk_info.pNext = NULL;
vk_info.pApplicationInfo = NULL;
vk_info.enabledLayerCount = 0;
vk_info.ppEnabledLayerNames = NULL;
vk_info.enabledExtensionCount = 0;
vk_info.ppEnabledExtensionNames = NULL;
res = vkCreateInstance(&vk_info, NULL, &inst);
if (res != VK_SUCCESS) {
// Error!
printf("Error %d\n", res);
return 1;
};
printf("Device created: %p\n", inst);
vkDestroyInstance(inst, NULL);
return (EXIT_SUCCESS);
}
Выход:
Device created: 0000000000534FD0
Вам обоим повезло больше, чем мне, но опять же, я пытался построить пример куба. Я продолжал получать усеченную проблему перемещения и после некоторого копания сумел соединить ее со старым сообщением об ошибке / запросом поддержки: https://sourceforge.net/p/mingw-w64/support-requests/19/
Мое решение состояло в том, чтобы использовать dlltool и извлечь символы из vulkan-1.dll (еще один старый способ — http://www.mingw.org/wiki/createimportlibraries). Это не сработало полностью, так как не могло извлечь какие-либо символы, поэтому мне пришлось заполнять их вручную (к счастью, gcc выдает 1 строку на неопределенный символ). По сути, вот начало моего файла vulkan-1.def (добавьте ваши функции, по одному на строку в конце):
LIBRARY vulkan-1.dll
vkAllocateCommandBuffers
vkAllocateDescriptorSets
vkAllocateMemory
; add functions as needed, one per line
Подготовив этот файл, запустите
dlltool -d vulkan-1.def -l libvulkan-1.a
Теперь вы можете использовать -L. -lvulkan-1 и избежать проблем с переездом. Моя полная командная строка gcc:
gcc -g cube.c -o cube.exe -I /c/VulkanSDK/1.0.8.0/Include/ -D_WIN32 -DVK_USE_PLATFORM_WIN32_KHR -L . -lvulkan-1 -mwindows
И вуаля, кубик работает.
Примечание: мне также нужно было заменить wcstombs_s на wcstombs для его компиляции. Полученная строка теперь:
numConverted = wcstombs(argv[iii], commandLineArgs[iii], wideCharLen + 1);
Мне удалось заставить его работать с TDM-GCC 64-bit, скопировав vulkan-1.dll в текущий каталог и связав его с этим. -M64 не требуется, но если vulkan-1.dll нет в текущем рабочем каталоге, ld.exe вылетает.
Конфигурация CMake:
...
FIND_PACKAGE(Vulkan REQUIRED)
IF(WIN32 AND NOT MSVC)
GET_FILENAME_COMPONENT(Vulkan_LIBRARY_DIR ${Vulkan_LIBRARY} DIRECTORY)
IF(NOT "${Vulkan_LIBRARY_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
MESSAGE(WARNING "If linking to Vulkan fails, try copying vulkan-1.dll to the ${CMAKE_BINARY_DIR} and then set Vulkan_LIBRARY to ${CMAKE_BINARY_DIR}/vulkan-1.dll")
ENDIF(NOT "${Vulkan_LIBRARY_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
ENDIF(WIN32 AND NOT MSVC)
TARGET_LINK_LIBRARIES(myprogram ${Vulkan_LIBRARY} ... )
...
Вместо того, чтобы использовать -lvulkan-1
или, столкнувшись с проблемой ddltool, вы можете попробовать явно перечислить vulkan-1.dll
и это должно разрешить символы.
gcc -std=c99 -m64 -g -Wall -Ic:\VulkanSDK\1.0.39.1\Include\vulkan vktest.c -o vktest c:\Windows\System32\vulkan-1.dll