与 GLFW MinGW 的链接问题

Linking problems with GLFW MinGW

我在 Code::blocks 中遇到了一些与 GLFW(3.1 版)的链接问题。我已经做了很多搜索,但我找不到任何东西似乎可以纠正任何问题。 我目前正在使用库的 32 位二进制文​​件,并且在我的项目中有这些链接器选项

-lmingw32  -lglew32 -lglfw3 -lopengl32 -lglu32 -lgdi32

我有点沮丧,因为我调查过的其他人提出的大多数问题总是存在缺少 gdi32 的问题,但这里不是这种情况,但我不知道是什么。

我得到的错误是

undefined reference to 'glfwInit'

如果有人知道我可能做错了什么,我将不胜感激。

编辑: 我忘记在我正在处理的实际项目中尝试和测试 glfw 函数(glfwInit 和 glfwTerminate),我刚才试了一下,它运行良好。我通过在我的 winmain 函数中调用 glfw 函数进行了测试,它运行良好。仅当我在我创建的调用 glfwInit() 的静态库中调用一个函数时才会出现问题,而这就是未定义的函数。我假设如果我在我当前的项目中包含并链接到 glfw,那么我正在使用的其他库也将能够调用 glfw 函数,不是这样吗?

另一个注意事项。如果我在引用 glfw 函数的静态库文件中包含 glfw3.h 它工作正常,但该文件已经包含一个包含 glfw3.h 的预编译头文件,因此即使没有明确包含 glf3.h 在文件中不应该吗?

嗯,GLFW has a CMake构建系统。因此,您可以导航到您的 GLFW 源代码并执行以下操作来构建示例 "boing":

C:\glfw-3.1>mkdir build

C:\glfw-3.1>cd build

C:\glfw-3.1\build>cmake -G "CodeBlocks - MinGW Makefiles" ..\
-- The C compiler identification is GNU 4.8.3
-- Check for working C compiler: C:/winbuilds/bin/gcc.exe
-- Check for working C compiler: C:/winbuilds/bin/gcc.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Found OpenGL: opengl32
-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - found
-- Found Threads: TRUE
-- Found Doxygen: C:/Work/env/doxygen-1.8.8/bin/doxygen.exe (found version "1.8.8")
-- Performing Test _GLFW_HAS_DEP
-- Performing Test _GLFW_HAS_DEP - Success
-- Performing Test _GLFW_HAS_ASLR
-- Performing Test _GLFW_HAS_ASLR - Success
-- Performing Test _GLFW_HAS_64ASLR
-- Performing Test _GLFW_HAS_64ASLR - Failed
-- Using Win32 for window creation
-- Using WGL for context creation
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/Brian.sidebotham/Desktop/glfw-3.1/glfw-3.1/build

C:\glfw-3.1\build>mingw32-make boing VERBOSE=ON

在构建 GFLW 本身的一些初始输出之后,您将获得 "boing" 示例的构建命令,特别是 link 命令:

C:\winbuilds\bin\gcc.exe -mwindows -Wl,--whole-archive CMakeFiles\boing.dir/objects.a -Wl,--no-whole-archive  -o boing.exe -Wl,--out-implib,libboing.dll.a -Wl,--major-image-version,0,--minor-image-version,0  ..\src\libglfw3.a -lglu32 -lopengl32 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32

等等,这就是您要模仿的静态库。如果你想 link 针对 DLL 那么做同样的事情,但是在使用 CMake 配置时包括 -DBUILD_SHARED_LIBS=ON 并且你会得到以下 link:

C:\winbuilds\bin\gcc.exe -mwindows -Wl,--whole-archive CMakeFiles\boing.dir/objects.a -Wl,--no-whole-archive  -o boing.exe -Wl,--out-implib,libboing.dll.a -Wl,--major-image-version,0,--minor-image-version,0  ..\src\glfw3dll.a -lglu32 -lopengl32 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32

如果您还有其他问题,请告诉我们。这些示例对我来说效果很好。

好的,我明白了!问题实际上并不是我的项目无法 link 正确地使用 glfw,它可以 link 正常。问题是它不只是 link 连接到我的项目,我还有另一个我编写的静态库,并且该库正在调用 glfw 函数。现在,我一直在通过 "Other linker options" 在 CodeBlocks 中添加我的所有库,除了我的静态库,我正在 link 将那个库添加到 "Link Libraries" 框中。我只能假设这使得它以错误的顺序 link 进入我的图书馆和 glfw,但我很确定这就是问题所在。