在 MinGW 上链接 GLFW 时出现未定义的参考错误

rec*_*ate 7 opengl mingw glfw

我正在尝试使用 minGW 在 Windows 上开发带有 GLEW 和 GLFW 的 openGL 应用程序。在当前目录中,project/我有目录src/bin/glfw-3.0.4.bin.WIN64/。我有文件test.cppglew.hglew.c,和wglew.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();
}
Run Code Online (Sandbox Code Playgroud)

我正在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
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

undefined reference to `_imp_glfwInit'
Run Code Online (Sandbox Code Playgroud)

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

我查看了与我类似的其他问题的解决方案,他们建议将 dll 文件复制到源/二进制目录并更改 -l 选项的顺序,但似乎都没有解决我的问题。

kel*_*tar 7

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

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

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