【问题标题】:GLFW Undefined References using Eclipse + MinGW on Windows 8在 Windows 8 上使用 Eclipse + MinGW 的 GLFW 未定义引用
【发布时间】:2026-02-12 15:05:01
【问题描述】:

我正在尝试设置 GLFW。我在 Windows 8.1 上的 Eclipse CDT 中工作

我已经下载了 GLFW 二进制文件并尝试在此处运行示例代码 http://www.glfw.org/documentation.html

到目前为止,我已经包含了 glfw 标头,并且我正在(静态)链接 glfw3、opengl32 和 gdi32(按此顺序)。

编译器正在运行以下命令

g++ "-IC:\\Libraries\\GLFW3\\include" -O0 -g3 -Wall -c -fmessage-length=0 -o main.o "..\\main.cpp" 
g++ "-LC:\\Libraries\\GLFW3\\lib-mingw" -o HelloGLFW3.exe main.o -lglfw3 -lopengl32 -lgdi32

对于每个 GLFW 函数,我都收到错误“未定义的引用 ...”。

我不知道我做错了什么。我已经进行了谷歌搜索,并且在 Stack Overflow 上提出了一些类似的问题,但没有一个能解决问题。最常见的建议是重新排序链接顺序,但据我所知顺序是正确的,我尝试过以防万一,但没有任何区别。

谁能提供有关如何正确链接的说明?

编辑:我已经尝试使用 32 位和 64 位 glfw 二进制文件(我最初的尝试是使用 64 位二进制文​​件,但 Google 表示尝试链接 32 位和 64 位程序可能会出现问题 - 从我可以告诉我的 MinGW 版本只能产生 32 位输出)。这些是产生的错误:

64 位二进制文​​件:

undefined reference to `glfwCreateWindow'   main.cpp    /HelloGLFW3 line 12 C/C++ Problem
undefined reference to `glfwInit'
undefined reference to `glfwMakeContextCurrent'
undefined reference to `glfwPollEvents'
undefined reference to `glfwSwapBuffers'
undefined reference to `glfwTerminate'
undefined reference to `glfwTerminate'
undefined reference to `glfwWindowShouldClose'

32 位二进制文​​件:

undefined reference to `_imp__CreateDCW@16' HelloGLFW3      line 0, external location: C:\Libraries\GLFW3\i386\lib-mingw\libglfw3.a(win32_gamma.c.obj):win32_gamma.c    C/C++ Problem
undefined reference to `_imp__CreateDCW@16'
undefined reference to `_imp__DeleteDC@4'
undefined reference to `_imp__DeleteDC@4'
undefined reference to `_imp__DescribePixelFormat@16'
undefined reference to `_imp__GetDeviceCaps@8'
undefined reference to `_imp__GetDeviceGammaRamp@8'
undefined reference to `_imp__SetDeviceGammaRamp@8'
undefined reference to `_imp__SetPixelFormat@12'
undefined reference to `_imp__SwapBuffers@4'

【问题讨论】:

  • 我假设您确实将下载的二进制文件放入您的lib-mingw 文件夹,对吧?你到底下载了哪个包?
  • 我下载了 64 位 Windows 二进制文件。它带有包含文件和用于 mingw 和 msvc 编译器的库;所以是的,这些库在 lib-mingw 文件夹中。
  • 好的,我也下载了它们,看看结构。能否请您发布一条“未解析的引用”错误消息,以便我可以查看他尝试解析哪种符号?
  • 嗯,刚刚重新安装了 MinGW,并使用您发布的命令行编写了调用 glfwInit()glfwCreateWindow() 的测试代码。工作正常。您是否尝试过删除 *.a 文件并链接到 DLL?
  • 我是个白痴,当我切换到 GLFW 的 32 位二进制文​​件时,我不小心删除了 -lgdi32 标签,这就是导致链接错误的原因。最初的问题是我使用的是 64 位 GLFW 库,而 GNU 编译器正在生成我的程序的 32 位输出。感谢您的帮助。

标签: c++ eclipse windows-8 glfw


【解决方案1】:

GLFW 提供 64 位和 32 位二进制版本。编译程序时,您可以生成 64 位输出或 32 位输出。您的程序必须与您正在使用的库兼容。

这意味着您拥有 64 位计算机并不意味着您需要 64 位二进制文​​件。此外,最好检查一下您的编译器是否在输出您认为它正在输出的内容。

【讨论】: