我正在尝试设置一个裸骨程序来使用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)|
我该怎么办?我是否链接到正确的图书馆?
答案 0 :(得分:4)
我能够编译一个简单的程序,只需用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
答案 1 :(得分:1)
你们两个人都比我更幸运,但话又说回来,我试图建立立方体的例子。我一直在解决重定位问题,经过一番挖掘后,设法将其连接到旧的错误报告/支持请求:https://sourceforge.net/p/mingw-w64/support-requests/19/
我的解决方案是使用dlltool并从vulkan-1.dll中提取符号(另一个旧的howto - 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);
答案 2 :(得分:1)
通过将vulkan-1.dll复制到当前目录并将其链接到该目录,我能够使用TDM-GCC 64位。 -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} ... )
...
答案 3 :(得分:0)
您可以尝试明确列出-lvulkan-1
,而不是使用vulkan-1.dll
或解决ddltool问题,而应该解析这些符号。
gcc -std=c99 -m64 -g -Wall -Ic:\VulkanSDK\1.0.39.1\Include\vulkan vktest.c -o vktest c:\Windows\System32\vulkan-1.dll