我是一名C ++初学者,在Java上尝试使用GLM,GLFW和Vulkan设置项目时有一些Java经验。这将是我第一次用像C ++这样的低级语言来弄脏自己。我在编译器将Vulkan和GLFW库链接到我的项目时遇到了很多麻烦。我正在按照教程here at vulkan-tutorial.org开始。这是main.cpp中的代码:
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp>
#include <iostream>
int main() {
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);
uint32_t extensionCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
std::cout << extensionCount << " extensions supported\n";
glm::mat4 matrix;
glm::vec4 vec;
auto test = matrix * vec;
while(!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
以下是用于编译它的命令:
g++ -std=c++11 -fexceptions -g -IC:/glfw-3.2.1/include -IC:/glm-0.9.9.1/glm -IC:/VulkanSDK/1.1.82.1/Include -IC:/glfw-3.2.1/include -c "src/main.cpp"
g++ -LC:/glfw-3.2.1/lib-mingw-w64 -LC:/VulkanSDK/1.1.82.1/Lib -o VulkanTest.exe main.o -lglfw3 -lvulkan-1
第一个命令成功地将.cpp编译成.o,但是第二个命令从链接器中给出了错误。我对Vulkan或GLFW成员的每一个引用都是未定义的。 (路径缩短了以便于阅读)
[omitted]/src/main.cpp:12: undefined reference to `glfwInit'
[omitted]/src/main.cpp:14: undefined reference to `glfwWindowHint'
[omitted]/src/main.cpp:15: undefined reference to `glfwCreateWindow'
[omitted]/src/main.cpp:18: undefined reference to `vkEnumerateInstanceExtensionProperties@12'
[omitted]/src/main.cpp:26: undefined reference to `glfwWindowShouldClose'
[omitted]/src/main.cpp:27: undefined reference to `glfwPollEvents'
[omitted]/src/main.cpp:30: undefined reference to `glfwDestroyWindow'
[omitted]/src/main.cpp:32: undefined reference to `glfwTerminate'
好像链接器找不到我用-L和-l提供的库文件,但如果我将-lglfw3更改为-llibglfw3.a或-lglwf3.dll,我会得到:
[omitted]/mingw32/bin/ld.exe: cannot find -llibglfw3.a
要么
[omitted]/mingw32/bin/ld.exe: cannot find -lglfw3.dll
引导我认为链接器DID最初找到了库,因为它没有抱怨无法找到库 - 但为什么它找不到GLFW / Vulkan函数引用的来源?我不知道发生了什么。它找到了库文件吗?
我正在使用GLFW 3.2.1,Vulkan SDK 1.1.82.1,MingW GCC版本6.3.0,我在Windows 10 Pro 64位上运行。
结果我的问题根源于使用旧版的MingW。最初我从here下载的the guide on MingW's wiki下载了MingW。我从this site更新到8.1.0,链接器开始抛出有关不同函数的未定义引用的错误,例如“__imp_CreateDCW”和“__imp_SwapBuffers”。
我碰巧认识到这些是我做过的其他研究中的GDI功能。我将GDI32添加到链接器中的libraries选项中,并且构建成功完成。
现在我的构建命令如下:
g++ -std=c++11 -fexceptions -g -IC:/glfw-3.2.1/include -IC:/glm-0.9.9.1/glm -IC:/VulkanSDK/1.1.82.1/Include -c "src/main.cpp"
g++ -LC:/glfw-3.2.1/lib-mingw-w64 -LC:/VulkanSDK/1.1.82.1/Lib -o VulkanTest.exe main.o -lglfw3 -lvulkan-1 -lgdi32