OpenGL与Eclipse CDT + MinGW + GLEW + GLFW:未定义的引用

5

编辑:我已经解决了这个问题,并在下面写了一个详细的答案。

我刚刚尝试从MSVC 10的Express版本切换到Win7上的Eclipse CDT,然后在配置时遇到了以下简单OpenGL代码的问题(在Visual Studio中运行良好):

#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>

int main()
{
    GLFWwindow* w;

    if (!glfwInit())
        return -1;

    w = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!w)
    {
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(w);

    glewExperimental = true;
    if (glewInit() != GLEW_OK)
    {
        return -1;
    }

    while (!glfwWindowShouldClose(w))
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glfwSwapBuffers(w);
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

在Visual Studio中,我包含了GLFW和GLEW的库路径,并链接(除了VS内置的东西之外)opengl32.lib、glew32s.lib和glfw3.lib,按照这个顺序。
现在如果我在Eclipse CDT中做同样的事情,我无法让它工作。会出现以下错误:
Info: Internal Builder is used for build
g++ "-LD:\\lib\\cpp\\glfw-3.0.1.bin.WIN32\\lib-mingw" "-LD:\\lib\\cpp\\glew-1.10.0binaries\\lib\\Release\\Win32" -o glfwcheck.exe main.o -lopengl32 -lglew32s -lglfw3 
Warning: .drectve `/DEFAULTLIB:"LIBCMT" /DEFAULTLIB:"OLDNAMES" ' unrecognized
D:\lib\cpp\glew-1.10.0binaries\lib\Release\Win32/glew32s.lib(tmp/glew_static/Release/Win32/glew.obj):(.text[__glewInit_GL_VERSION_1_2]+0x4): undefined reference to `_imp__wglGetProcAddress@4'
D:\lib\cpp\glew-1.10.0binaries\lib\Release\Win32/glew32s.lib(tmp/glew_static/Release/Win32/glew.obj):(.text[__glewInit_GL_VERSION_1_3]+0x4): undefined reference to `_imp__wglGetProcAddress@4'
d:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: D:\lib\cpp\glew-1.10.0binaries\lib\Release\Win32/glew32s.lib(tmp/glew_static/Release/Win32/glew.obj): bad reloc address 0x4 in section `.text[__glewInit_GL_VERSION_1_3]'
d:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status

当然,我试过改变这三个库的顺序,但情况只变得更糟。(顺便说一下:我觉得奇怪的是,如果我重新排列这些库以使它们成为唯一的错误,我无法复制上述错误。我保持在20多个错误,直到我删除所有库,构建并重新添加它们。)在摸索和查阅论坛帖子后,我发现可能是GLEW二进制文件的问题,并使用MinGW自己编译了它们。但是这一次,我收到了所有“未找到”错误。我不知道如何与我自己编译的GLEW静态链接,因为现在已经没有glew32s.lib了,只有libglew32.a和libglew32mx.a。动态链接glew32并将dll放入我的项目文件夹中也不起作用。我感觉我在Eclipse中做错了什么,或者只是忘记了额外的库(尽管我曾经尝试将VS使用的所有库都放在那里,它仍然做了完全相同的事情)。你能帮我吗? :)否则,我认为我必须继续使用VS,或者切换到Linux + make。

1
这并不能解决问题,但可以预防未来的问题。在调用 glfwMakeContextCurrent(w); 后需要调用 glewInit() - vallentin
1
@Vallentin 谢谢,你说得对,我想我甚至在切换到GLFW3时遇到过这种情况:D - InvisiblePanda
@InvisiblePanda - 你在问题的建议编辑方面做得非常出色,以至于我认为我应该以某种方式让你知道(即使这不是正确的地方!)。继续保持良好的工作! - ʍǝɥʇɐɯ
1个回答

4

我解决了这个问题,对于任何遇到这个问题的人,我会尽力说明我最终是如何使用MinGW + GLEW + GLFW配置创建OpenGL项目的。在我的情况下,我使用Eclipse CDT作为IDE,但我将写下生成的g++命令行,所以适应其他IDE应该很容易。

  1. 假设已经安装了MinGWMSYS(可以从MinGW GUI中选择安装,因此不需要单独下载)。

  2. 下载GLFW并将其解压到你选择的外部库文件夹中(在我的情况下,这是D:\external\cpp,所以它应该类似于D:\external\cpp\glfw,其中我将glfw-3.0.3.bin.WIN32文件夹重命名为简单的glfw)。

  3. 下载GLEW 源代码的zip文件并解压缩它,在我的情况下它在D:\external\cpp\glew中。现在启动MSYScd进入glew文件夹并调用make all

  4. 第3步应该创建了(包括其他)libglew32.aglew32.dll文件,它们位于glew\lib文件夹中。现在右键单击Eclipse CDT C++项目,转到Properties-C/C++ General-Paths and Symbols。在Includes选项卡中,添加GLFW和GLEW的include文件夹的路径。同样,对于我来说,这是D:\external\cpp\glew\include,GLFW相似。在Library Paths中,对于lib(GLEW)和lib-mingw(GLFW)文件夹,也要执行相同操作。

  5. 现在我们必须将我们希望项目链接的库添加进去。如果您想与GLEW动态链接,请确保将glew32.dll包含在可执行文件所在的文件夹中。在Eclipse CDT中,这通常是项目结构中的Debug(或Release)文件夹。在我们之前打开的选项窗口的Libraries选项卡中添加(顺序很重要!)glfw3glew32opengl32glu32gdi32。现在构建项目应该能工作了。如果您想静态链接GLEW,则添加相同的库,但不包括glew32。相反,在项目属性中转到C/C++ Build-Settings,在Tool Settings-MinGW C++ Linker-Miscellaneous选项卡中将libglew32.a的路径添加到Other objects字段中。在我的情况下,这是D:\external\cpp\glew\lib\libglew32.a。现在为了使静态链接工作,您必须在#include <GL/glew.h>之前添加#define GLEW_STATIC或使用预处理器命令-DGLEW_STATIC。GLEW主页说也可以将glew.cglew.h文件包含到您的项目中以进行静态链接,但某种原因这对我并不起作用。以下步骤适用于我,并产生了类似于以下命令行的命令(我只有一个名为main.cpp的文件,并使用GLEW进行静态链接),如果你想在没有Eclipse CDT的情况下解决此问题,这可能会很有用。

    g++ -ID:\external\cpp\glew\include -ID:\external\cpp\glfw\include -c -o main.o main.cpp
    g++ -LD:\external\cpp\glew\lib -LD:\external\cpp\glfw\lib-mingw -o minimalexample.exe main.o D:\external\cpp\glew\lib\libglew32.a -lglfw3 -lopengl32 -lglu32 -lgdi32
    

    在动态链接的情况下,只需在第二行中删除包含“libglew32.a”的部分,并在-lglfw3-lopengl32之间添加-lglew32。作为一个小例子源文件,您可以使用我上面问题中的代码。
    希望这能帮助任何人,因为我确实发现自己在解决数十个未解析符号和各种其他问题的过程中遇到了很多麻烦 :-)
    更新:几天前我试图再次处理此问题,并遇到了Windows预编译GLFW二进制文件的问题(我现在正在使用Win8.1)。但是,您可以使用CMakemingw32-make结合使用来自行编译它。另外,GLEW似乎不再得到更新,因此我改用glad。还可以使用MinGW-w64将库和最终项目编译为64位应用程序。

在第三步中,我无法找到如何在MSYS中导航到“glew”文件夹。这个问题的答案对我很有帮助:https://dev59.com/SGgu5IYBdhLWcg3wWl8q - Paul Wintz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接