与 GLFW MinGW 的链接问题

Posted

技术标签:

【中文标题】与 GLFW MinGW 的链接问题【英文标题】:Linking problems with GLFW MinGW 【发布时间】:2015-03-04 09:14:30 【问题描述】:

我在 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 它也应该工作不应该吗?

【问题讨论】:

您是否在项目的 bin 中复制了库 GLFW 的 .dll 文件 尝试在链接标志的末尾重复-lglfw3,以便链接器再次重新检查该库(假设glfwInit 位于该库中)。一般来说,不幸的是,链接器只能从左到右解析,而不是双向解析。这意味着库语句的顺序至关重要。 【参考方案1】:

好的,我明白了!问题实际上并不是我的项目无法正确链接到 glfw,它可以正常链接。问题是它不仅仅是链接到我的项目,我还有另一个我编写的静态库,并且该库正在调用 glfw 函数。现在,我一直在通过 CodeBlocks 中的“其他链接器选项”添加我的所有库,除了我的静态库,我在“链接库”框中链接了那个库。我只能假设这样做是因为它以错误的顺序链接到我的库和 glfw,但我很确定这是发生了什么。

【讨论】:

【参考方案2】:

好吧,GLFW 有一个 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”示例的构建命令,尤其是链接命令:

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

因此,这就是您要为静态库模仿的内容。如果您想要链接到 DLL,请执行相同操作,但在使用 CMake 进行配置时包含 -DBUILD_SHARED_LIBS=ON 并且您会获得以下链接:

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

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

【讨论】:

哦,感谢您指出这一点,我从没想过使用 CMake 来显示示例项目中使用的构建选项。然而,经过一段时间的休息后,我测试了一些东西,现在我认为我之前没有正确诊断出我的问题,我已经编辑了我的问题以详细说明。

以上是关于与 GLFW MinGW 的链接问题的主要内容,如果未能解决你的问题,请参考以下文章

动态链接 GLFW 和 make

使用 makefile 链接 GLFW 库时遇到问题

mingw64下编译GLFW的Win64版本

在 CodeBlocks 中设置 GLFW 的问题

mingw链接opengl

mingw链接opengl