尽管库似乎已链接,但未定义对GLFW / Vulkan的引用

时间:2018-09-15 18:50:19

标签: c++ linker

我是一位C ++初学者,具有一定的Java经验,试图在Windows上使用GLM,GLFW和Vulkan建立项目。这将是我第一次使用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位系统上运行。

1 个答案:

答案 0 :(得分:1)

原来,我的问题根源于使用旧版本的MingW。最初,我从here下载了MingW,这是the guide on MingW's wiki推荐的。我将this site的版本更新为8.1.0,链接器开始抛出有关未定义引用不同函数(例如“ __imp_CreateDCW”和“ __imp_SwapBuffers”)的错误。

我偶然从其他一些研究中认识到这些是GDI功能。我将GDI32添加到链接器的librarys选项中,构建成功完成。

现在,我的构建命令如下:

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