在MinGW上链接GLFW时未定义的引用错误

时间:2014-03-25 00:09:15

标签: opengl mingw glfw

我正在尝试使用minGW在Windows上使用GLEW和GLFW开发一个openGL应用程序。在当前目录project/中,我有目录src/bin/glfw-3.0.4.bin.WIN64/。我在test.cpp目录中有glew.hglew.cwglew.hsrc/个文件。

目录./glfw-3.0.4.bin.WIN64/include/包含GLFW/glfw3.h头文件。

目录./glfw-3.0.4.bin.WIN64/lib-mingw/包含glfw3.dllglfw3dll.alibglfw3.a

我的主文件test.cpp包含

#include "glew.h"
#include "GLFW/glfw3.h"

#include <stdio.h>

int main(int argc, char** argv) {
    printf("Hello, World!\n");

    glewInit();
    glfwInit();
}

我正在通过运行来编译project/目录中的程序(为了便于阅读,分成两行)

gcc -DGLEW_STATIC -DGLFW_DLL -o ./bin/test ./src/*.cpp ./src/glew.c 
-I ./glfw-3.0.4.bin.WIN64/include/ -L ./glfw-3.0.4.bin.WIN64/lib-mingw/ -lglfw3 -lopengl32

我收到以下错误:

undefined reference to `_imp_glfwInit'

我认为问题与我错误地链接GLFW库有关。根据我的理解,包括编译器选项-lglfw3将告诉gcc链接./glfw-3.0.4.bin.WIN64/lib-mingw/glfw3.dll,其中包含glfwInit()的定义。

我已经看过类似于我的其他问题的解决方案,他们提出了诸如将dll文件复制到源/二进制目录以及更改-l选项的顺序之类的事情,但似乎都没有解决我的问题。

1 个答案:

答案 0 :(得分:1)

你的问题是gcc遵循严格的库命名约定。它会尝试查找glfw3.dll.a,但找不到(因为它名为glfw3dll.a - 简单重命名将解决您的问题。)

下一步它查找libglfw3.a并成功 - 但它是一个静态库,而引用在头文件中声明为动态(棘手的Windows DECLSPECs ......这个问题不存在于例如linux上)。因此,它无法找到_imp__glfwInit,因为在静态库中它只被调用glfwInit,因此您收到错误。

删除libglfw3.a也是一种选择 - 在这种情况下,gcc会进一步查找并最终找到glfw3.dll并使用它。