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

Inv*_*nda 5 c++ opengl glew mingw 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;
}
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Inv*_*nda 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。在“包含”选项卡中,添加 GLFW 和 GLEW 文件夹的路径include。同样,对我来说,这D:\external\cpp\glew\include与 GLFW 类似。在“库路径”中,对文件夹lib(GLEW) 和lib-mingw(GLFW) 执行相同的操作。

  5. 现在我们必须添加我们希望项目链接的库。如果您希望动态链接 GLEW,请确保将 包含glew32.dll在可执行文件所在的文件夹中。在 Eclipse CDT 中,这通常是项目结构中的Debug(或) 文件夹。Release在我们之前打开的选项窗口的“库”选项卡中,添加(顺序很重要!)glfw3, glew32, opengl32, glu32, gdi32。现在构建该项目应该有望成功。如果您想与 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文件包含到您的项目中以便静态链接,但不知何故,这对我来说并没有真正起作用。

这些步骤对我有用,并且它们生成了类似于以下内容的命令行(我只有一个名为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
Run Code Online (Sandbox Code Playgroud)

libglew32.a在动态链接的情况下,只需删除第二行中包含的部分,并在和-lglew32之间添加即可。作为一个小示例源文件,您可以使用我上面问题中的代码。-lglfw3-lopengl32

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

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