C 将问题与GLFW MinGW联系起来

C 将问题与GLFW MinGW联系起来,c,codeblocks,linker-errors,glfw,C,Codeblocks,Linker Errors,Glfw,我在Code::blocks中与GLFW(3.1版)存在一些链接问题。我做了大量的搜索,但我找不到任何东西可以纠正任何问题。 我目前正在使用库的32位二进制文件,并且在我的项目中有这些链接器选项 -lmingw32 -lglew32 -lglfw3 -lopengl32 -lglu32 -lgdi32 我一直有点沮丧,因为我调查过的其他人提出的大多数问题都有一个问题,就是他们缺少gdi32,但这里不是这样,但我不知道是什么 我得到的错误是 undefined reference to 'gl

我在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源代码并执行以下操作来构建示例“boing”:

在生成GFLW本身的一些初始输出之后,您将获得“boing”示例的build命令,尤其是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
所以,这就是你想要模仿的静态库。如果要针对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

如果您还有任何问题,请告诉我们。这些例子对我很有用。

好的,我已经弄明白了!问题并不是我的项目不能正确链接到glfw,它可以链接得很好。问题是,它不仅仅是链接到我的项目,我还编写了另一个静态库,该库正在调用glfw函数。现在,我已经通过代码块中的“其他链接器选项”添加了我所有的库,除了我的静态库,我正在“链接库”框中链接那个库。我只能假设这使得它以错误的顺序链接到我的库和glfw,但我很确定这就是问题所在。

您是否在项目的bin中复制了库glfw的
.dll
文件尝试在链接标志的末尾重复
-lglfw3
,以便链接器再次检查库(假设
glfwInit
位于该库中)。通常,链接器只能从左到右解析,而不是双向解析;这意味着库语句的顺序至关重要。哦,感谢您指出这一点,我从未想过使用CMake来显示示例项目中使用的构建选项。然而,经过一段时间的休息之后,我测试了一些东西,现在我认为我以前没有正确地诊断出我的问题,我对我的问题进行了一些编辑,以详细说明。
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