7

我正在尝试设置一个简单的程序来使用 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)|

我该怎么办?我是否链接到正确的库?

4

4 回答 4

6

我能够编译一个简单的程序,只需调用vkCreateInstancewith MinGW-64

也许你得到的错误与-m64标志有关。

按照下面我的配置:

  • 视窗 8.1
  • NetBeans IDE 8.1
  • Vulkan SDK 1.0.3.1
  • gcc 版本 5.3.0(x86_64-posix-seh-rev0,由 MinGW-W64 项目构建)

使用 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

于 2016-02-21T08:41:07.800 回答
3

你们俩都比我幸运,但话又说回来,我试图构建立方体示例。我不断收到搬迁截断问题,经过一番挖掘,设法将其连接到旧的错误报告/支持请求: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);
于 2016-04-16T23:41:50.797 回答
2

通过将 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} ... )
...
于 2017-06-16T20:12:22.970 回答
2

-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

于 2017-02-03T19:59:52.350 回答