我正在尝试使用minGW在Windows上使用GLEW和GLFW开发一个openGL应用程序。在当前目录project/
中,我有目录src/
,bin/
和glfw-3.0.4.bin.WIN64/
。我在test.cpp
目录中有glew.h
,glew.c
,wglew.h
和src/
个文件。
目录./glfw-3.0.4.bin.WIN64/include/
包含GLFW/glfw3.h
头文件。
目录./glfw-3.0.4.bin.WIN64/lib-mingw/
包含glfw3.dll
,glfw3dll.a
和libglfw3.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选项的顺序之类的事情,但似乎都没有解决我的问题。
答案 0 :(得分:1)
你的问题是gcc遵循严格的库命名约定。它会尝试查找glfw3.dll.a
,但找不到(因为它名为glfw3dll.a
- 简单重命名将解决您的问题。)
下一步它查找libglfw3.a
并成功 - 但它是一个静态库,而引用在头文件中声明为动态(棘手的Windows DECLSPECs ......这个问题不存在于例如linux上)。因此,它无法找到_imp__glfwInit
,因为在静态库中它只被调用glfwInit
,因此您收到错误。
删除libglfw3.a
也是一种选择 - 在这种情况下,gcc会进一步查找并最终找到glfw3.dll
并使用它。