为啥我得到:“未定义的对 `glfwInit' 的引用”?
Posted
技术标签:
【中文标题】为啥我得到:“未定义的对 `glfwInit\' 的引用”?【英文标题】:Why am I getting: "undefined reference to `glfwInit'"?为什么我得到:“未定义的对 `glfwInit' 的引用”? 【发布时间】:2018-12-28 14:37:32 【问题描述】:每当我尝试通过 MSYS2、Autotools 和 make
编译我的 OpenGL 示例项目时(它使用静态编译GLEW 和 GLFW)我得到这样的输出:
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
更改为_LDADD
(在 Makefile.am 中)就足够了,并且解决了我的问题。
是的,@Don,库应该列在*LDADD
,而不是*LDFLAGS
。事实上,这就是LDADD
变量的全部意义所在。 -L
选项可以在任一位置列出,但所有其他链接器选项(与要链接的对象和库相反)应包含在 LDFLAGS
中。以上是关于为啥我得到:“未定义的对 `glfwInit' 的引用”?的主要内容,如果未能解决你的问题,请参考以下文章