FINAL EDIT:这是TDM_GCC的编译器/链接器错误。见答案。
编辑:就我所知,这不是重复。问题似乎是一个简单的noob错误,但事实并非如此。我已经链接到正确的Vulkan库" vulkan-1.lib"使用TDM-GCC-64(用于Windows的GCC / MinGW工具包),并使用VulkanSDK示例中的示例代码。这个页面How do I use Vulkan with MinGW? (R_X86_64_32 error)也确认它可以在MinGW上运行,它与TDM-GCC-64没什么区别,因为它使用了部分MinGW。如果这是一个简单回答的副本,那么我很抱歉,但到目前为止还没有人解决这个问题,而且#34;简单"问题
EDIT2:这是我的项目文件。只需编辑makefile,然后运行" 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
我的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
我做错了什么?我正在联系agaist正确的库,对吗?
这是我的程序代码:
#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 :(得分:2)
正如我发现的那样,(感谢@Gomiero),如果我使用MinGW-w64 x86_64 posix seh rev0尝试同样的构建,它将完美运行!似乎TDM-GCC-64以及常规的MinGW都存在“vulkan-1”库的问题。所以,这总结为编译器/链接器错误!
答案 1 :(得分:0)
大多数情况下,当您忘记链接库时会出现未定义的引用。 由于头文件,编译器能够看到定义,但是为了创建可执行文件,它需要有ether或源或二进制文件(.o,.obj,.a,.dll,.so,... )与它链接。 当此文件不存在时,它无法看到定义。 这是未定义的引用意味着什么。 还要注意我看到你在32位计算机上的一件事(-m32 ==机器32位)一定要与32位版本的Vulkan库链接。