我是一名 C++ 初学者,拥有一些 Java 经验,尝试在 Windows 上使用 GLM、GLFW 和 Vulkan 建立一个项目。这将是我第一次接触像 C++ 这样的低级语言。我在让编译器将 Vulkan 和 GLFW 库链接到我的项目时遇到了很多麻烦。我按照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;
}
Run Code Online (Sandbox Code Playgroud)
以下是用于编译它的命令:
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
Run Code Online (Sandbox Code Playgroud)
第一个命令成功地将 .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'
Run Code Online (Sandbox Code Playgroud)
链接器似乎找不到我用 -L 和 -l 提供的库文件,但是如果我将 -lglfw3 更改为 -llibglfw3.a 或 -lglwf3.dll,我会得到以下结果:
[omitted]/mingw32/bin/ld.exe: cannot find -llibglfw3.a
Run Code Online (Sandbox Code Playgroud)
或者
[omitted]/mingw32/bin/ld.exe: cannot find -lglfw3.dll
Run Code Online (Sandbox Code Playgroud)
让我认为链接器一开始确实找到了库,因为它没有抱怨无法找到库 - 但为什么它找不到 GLFW / Vulkan 函数引用的源呢?我不知道发生了什么事。是不是找到库文件了?
我使用的是 GLFW 3.2.1、Vulkan SDK 1.1.82.1、MingW GCC 版本 6.3.0,并且在 Windows 10 Pro 64 位上运行。
事实证明我的问题根源在于使用旧版本的 MingW。最初我从这里下载了 MingW,这是MingW wiki 上的指南推荐的。我从此站点更新到 8.1.0 ,链接器开始抛出有关对不同函数的未定义引用的错误,例如“__imp_CreateDCW”和“__imp_SwapBuffers”。
\n\n我碰巧从我所做的其他一些研究中认识到这些是 GDI 函数。我将 GDI32 添加到链接器中的库选项中,并且构建成功完成。
\n\n现在我的构建命令如下:
\n\ng\xef\xbb\xbf++ -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"\ng+\xef\xbb\xbf+ -LC:/glfw-3.2.1/lib-mingw-w64 -LC:/VulkanSDK/1.1.82.1/Lib -o VulkanTest.exe main.o -lglfw3 -lvulkan-1 -lgdi32\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2721 次 |
| 最近记录: |