我在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也应该工作不应该吗?
答案 0 :(得分:1)
好的我弄清楚了!问题实际上我的项目无法正确链接到glfw,它可以很好地链接。问题是它不仅仅是链接到我的项目,我有另一个我写过的静态库,那个库正在调用glfw函数。现在,我一直在通过"其他链接器选项"添加我的所有库。在CodeBlocks中,除了我的静态库之外,我在" Link Libraries"中链接了那个。框。我只能假设这样做是因为它以错误的顺序链接到我的图书馆和glfw,但我很确定会发生什么事情。
答案 1 :(得分:0)
好吧,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
如果您还有其他问题,请告诉我们。这些例子对我来说很有用。