为啥我得到:“未定义的对 `glfwInit' 的引用”?

Posted

技术标签:

【中文标题】为啥我得到:“未定义的对 `glfwInit\' 的引用”?【英文标题】:Why am I getting: "undefined reference to `glfwInit'"?为什么我得到:“未定义的对 `glfwInit' 的引用”? 【发布时间】:2018-12-28 14:37:32 【问题描述】:

每当我尝试通过 MSYS2Autotoolsmake 编译我的 OpenGL 示例项目时(它使用静态编译GLEWGLFW)我得到这样的输出:

x86_64-w64-mingw32-g++ -DHAVE_CONFIG_H -I. -I./include  -I./include/GL -I./include/GLFW -DGLEW_STATIC   -g -O2 -MT src/opengl_tut-main.o -MD -MP -MF src/.deps/opengl_tut-main.Tpo -c -o src/opengl_tut-main.o `test -f 'src/main.cpp' || echo './'`src/main.cpp
mv -f src/.deps/opengl_tut-main.Tpo src/.deps/opengl_tut-main.Po
x86_64-w64-mingw32-g++  -g -O2 -L./lib -lglfw3 -lglew32 -lopengl32 -lgdi32  -o opengl_tut.exe src/opengl_tut-main.o
src/opengl_tut-main.o: In function `main':
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:13: undefined reference to `glfwInit'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:21: undefined reference to `glfwWindowHint'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:22: undefined reference to `glfwWindowHint'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:24: undefined reference to `glfwWindowHint'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:25: undefined reference to `glfwWindowHint'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:27: undefined reference to `glfwCreateWindow'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:41: undefined reference to `glfwGetFramebufferSize'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:45: undefined reference to `glfwMakeContextCurrent'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:49: undefined reference to `glewInit'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:58: undefined reference to `glViewport'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:62: undefined reference to `glfwPollEvents'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:64: undefined reference to `glClearColor'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:65: undefined reference to `glClear'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:67: undefined reference to `glfwSwapBuffers'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:60: undefined reference to `glfwWindowShouldClose'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:16: undefined reference to `glfwTerminate'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:52: undefined reference to `glfwDestroyWindow'
C:\Users\Test\Desktop\OpenGL_2/src/main.cpp:53: undefined reference to `glfwTerminate'
C:\Users\DoTestn\Desktop\OpenGL_2/src/main.cpp:35: undefined reference to `glfwTerminate'
src/opengl_tut-main.o:main.cpp:(.rdata$.refptr.glewExperimental[.refptr.glewExperimental]+0x0): undefined reference to `glewExperimental'
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile:361: opengl_tut.exe] Error 1  

我不明白的是,我可以使用手动输入的命令编译我的代码,如下所示:

x86_64-w64-mingw32-g++ -ggdb -Og -std=c++14 src/main.cpp -o bin/opengl_tut.exe -DGLEW_STATIC -I./include/GL -I./include/GLFW -L./lib -lglfw3 -lglew32 -lopengl32 -lgdi32  

但是,我更愿意使用 Autotools 来获得相同的结果。

【问题讨论】:

【参考方案1】:

src/opengl_tut-main.o 对象可能依赖于 OpenGL 库,因此在将所有内容链接在一起的最终命令中,它必须列在 OpenGL 库之前。

【讨论】:

是的,你是对的。当我将该命令修改为:x86_64-w64-mingw32-g++ -g -O2 src/opengl_tut-main.o -L./lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -o opengl_tut.exe - 它运行良好。但是我应该怎么做才能让 Autoconf / Automake 做同样的事情呢? 显然,将_LDFLAGS 更改为_LDADDMakefile.am 中)就足够了,并且解决了我的问题。 是的,@Don,库应该列在*LDADD,而不是*LDFLAGS。事实上,这就是LDADD 变量的全部意义所在。 -L 选项可以在任一位置列出,但所有其他链接器选项(与要链接的对象和库相反)应包含在 LDFLAGS 中。

以上是关于为啥我得到:“未定义的对 `glfwInit' 的引用”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得到一个零数组

为啥我得到一个 nullPointerException? [复制]

为啥我没有得到任何回应

为啥我得到黑色纹理?

为啥我得到分段(核心转储)?

为啥我得到 getApplicationcontext() null?