使用Eclipse CDT + MinGW + GLEW + GLFW的OpenGL:未定义的参考

时间:2013-12-30 10:10:25

标签: c++ opengl mingw glew glfw

编辑:我在此期间已经想到这一点,并在下面写了详细的答案。

我刚尝试在Win7上从Express版本的MSVC 10切换到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

当然我尝试改变三个库的顺序,但这只会让它变得更糟。 (顺便说一句:我认为我不能重现上面的这些错误,这是因为当我将lib重新排列到初始顺序时它们是唯一的错误。我保持20多个错误,直到我删除所有的libs ,构建,并再次添加它们。)

在摸索并浏览论坛帖子之后,我想可能是GLEW二进制文件存在问题,并且我自己用MinGW编译它们。只有这一次,我得到了所有'未找到'的错误。我不知道如何静态链接我自编的GLEW,因为现在不再有glew32s.lib了,只有libglew32.a和libglew32mx.a。动态链接glew32并将dll放入我的项目文件夹也不起作用。

我觉得我在Eclipse中做了一些非常错误的事情,或者只是忘记了一些额外的库(虽然我曾尝试将所有VS用于那里但它仍然完全相同)。

你能救我吗? :)否则我认为我必须留在VS,或切换到Linux + make。

1 个答案:

答案 0 :(得分: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。现在启动 MSYS cdglew文件夹并调用make all

  4. 第3步应创建文件夹libglew32.a内的文件glew32.dllglew\lib(以及其他文件)。现在右键单击Eclipse CDT C ++项目,转到属性 - C / C ++常规 - 路径和符号。在 Includes 标签中,添加GLFW和GLEW的include文件夹的路径。同样,对我而言,这是D:\external\cpp\glew\include,类似于GLFW。在图书馆路径中,对文件夹lib(GLEW)和lib-mingw(GLFW)执行相同操作。

  5. 现在我们必须添加我们希望项目链接的库。如果您希望动态链接GLEW,请确保将glew32.dll包含在您的可执行文件所在的文件夹中。在Eclipse CDT中,这通常是项目结构中的Debug(或Release)文件夹。在我们之前打开的选项窗口的 Libraries 标签中,添加(顺序很重要!)glfw3glew32opengl32glu32gdi32。现在建设项目应该有希望。如果您想要与GLEW静态链接,请添加相同的库,但glew32除外。相反,在项目属性中转到 C / C ++构建 - 设置,并在工具设置 - MinGW C ++链接器 - 其他选项卡中添加libglew32.a的路径其他对象字段。就我而言,这是D:\external\cpp\glew\lib\libglew32.a。现在,为了使静态链接起作用,您必须在#define GLEW_STATIC之上添加#include <GL/glew.h>或使用预处理器命令-DGLEW_STATIC。 GLEW主页说,还可以将glew.cglew.h文件包含在您的项目中,以便静态链接,但不知何故,这对我来说并不合适。

  6. 这些步骤对我有用,他们生成了类似于以下的命令行(我只有一个名为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的部分,然后在-lglew32-lglfw3之间添加-lopengl32。作为一个小示例源文件,您可以使用上面问题中的代码。

    我希望我可以帮助任何人,因为我确实看到我在解决未解决的符号和其他各种问题的数十条错误信息之间遇到了很多麻烦: - )

    更新:我几天前试图再次讨论这个问题,并且遇到了预编译的Windows GLFW二进制文件的问题(我现在使用的是Win8.1)。但您可以将CMakemingw32-make结合使用,自行编译。此外,GLEW似乎不再获得更新,所以我切换到glad。也可以使用MinGW-w64将库和最终项目编译为64位应用程序。