【问题标题】:Undefined reference when using glew and mingw?使用glew和mingw时未定义的引用?
【发布时间】:2017-08-03 00:48:55
【问题描述】:

我使用的是 Eclipse,我最初是从网站下载二进制文件,直到有人指出我需要从源代码构建它才能使其与 mingw 一起使用,所以我这样做了,我得到了这些文件:glew32. dlllibglew32.alibglew32.dll.a

我将 glew32.dll 放入调试文件夹,并链接了库,但它不起作用。

奇怪的部分:GLenum status = glewInit(); 有效,但 glClearColorglClear 无效,当我尝试调用它们时出现 undefined reference to 错误。

请看以下截图:http://imgur.com/a/L8iNbhttp://imgur.com/a/nYoWD

C++.cpp

#include <iostream>
#include "classHeaders\display.h"
#include "GL\glew.h"


int main(int argv, char** args){
  display x(800,600,"something");

  while(!x.isClosed()){
    glClearColor(0.0f,0.15f,0.3f,1.0f); //undefined reference to ERROR here
    glClear(GL_COLOR_BUFFER_BIT); //undefined reference to ERROR here
    x.Update();
  }
  return 0;
}

display.cpp

#include "classHeaders\display.h"
#include "GL\glew.h"
#include <iostream>
display::display(int width, int height, const std::string& title){

     SDL_Init(SDL_INIT_EVERYTHING);

     SDL_GL_SetAttribute(SDL_GL_RED_SIZE,8);
     SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,8);
     SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,8);
     SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,8);
     SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,32);
     SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);

     m_window = SDL_CreateWindow(title.c_str(),SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,width,height, SDL_WINDOW_OPENGL);

     m_glContext = SDL_GL_CreateContext(m_window);

     GLenum status = glewInit(); //NO ERRORS OCCUR

     if(status != GLEW_OK){
         std::cerr << "glew failed to initialize" << std::endl;
     }

     m_isClosed = false;
}

display::~display(){
     SDL_GL_DeleteContext(m_glContext);
     SDL_DestroyWindow(m_window);
     SDL_Quit();
}

bool display::isClosed(){
     return m_isClosed;
}

void display::Update(){
     SDL_GL_SwapWindow(m_window);
     SDL_Event e;

    while(SDL_PollEvent(&e)){
        if(e.type == SDL_QUIT){
           m_isClosed = true;
         }
    }
}

display.h

#ifndef DISPLAY_H_
#define DISPLAY_H_

#include <string>
#include "SDL2\SDL.h"
#undef main /*need to put this in or else it gives me "undefined reference to WinMain" ERROR*/

class display{

    public:
        display(int width, int height, const std::string& title);
        void Update();
        bool isClosed();
        virtual ~display();

    private:
        display(const display& other){}
        display& operator=(const display& other){}
        SDL_Window* m_window;
        SDL_GLContext m_glContext;
        bool m_isClosed;

  };

  #endif /* DISPLAY_H_ */

【问题讨论】:

  • 我不知道还能问这个。它很简短,而且很重要。另外,如果您能帮助我解决这个问题,我将不胜感激。
  • 这意味着当我调用它们时它们不起作用,我得到一个“未定义的引用”错误,这很奇怪,因为 'glewInit();'作品。就像它如何能够调用 'glewInit():' 而不是 'glClear'?
  • 基本上它在我调用函数的行上给了我“未定义的引用”错误。但是当我调用 'glewInIt():' 函数时,它并没有给我一个“未定义的引用”错误。他们在帖子中提到的所有 3 个函数都属于“glew”,那么为什么只有 1 个可以工作,但我得到了其他函数的“未定义参考”?
  • glew 库和您的应用程序是否使用相同的编译器和相同的目标(32/64 位)编译?我建议不要使用预构建 glew lib,而是自己构建它或将源添加为任何其他文件。

标签: c++ eclipse opengl glew


【解决方案1】:

要设置GLEW,需要当前的OpenGL Context(有关详细信息,请参阅Creating an OpenGL Context (WGL))。

创建 OpenGL 上下文和窗口

SDLGLFWGLUT 可以轻松创建OpenGL Context 和窗口(有关详细信息,请参阅Initializing GLEW)。

初始化SDL

如果你使用SDL,你必须创建窗口并且你必须创建OpenGL上下文。

SDL_Window *window = SDL_CreateWindow(""OGL window", SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL );
SDL_GLContext glContext = SDL_GL_CreateContext( window );

注意,您应该检查SDL_GetError 的错误。

OpenGL 上下文必须先成为当前上下文,然后才能使用它。为此使用SDL_GL_MakeCurrent

SDL_GL_MakeCurrent( window, glContext );

初始化GLUT

要设置GLUT,您必须使用glutInit,并且可以按照初始化glew的说明进行操作。

glutInit(&argc, argv);
glutCreateWindow("OGL window");

初始化GLFW

注意,glfwInit 如果成功则返回GLFW_TRUE

if ( glfwInit() != GLFW_TRUE )
    return;

GLFWwindow *wnd = glfwCreateWindow( width, height, "OGL window", nullptr, nullptr );
if ( wnd == nullptr )
{
    glfwTerminate();
    return;
}

glfwMakeContextCurrent( wnd );

创建OpenGL Context 并使其成为当前上下文后,您必须初始化glew

设置GLEW

请注意,glewInit 如果成功则返回 GLEW_OK

if ( glewInit() != GLEW_OK )
    return;

要正确链接GLEW 库,您必须设置正确的预处理器定义

在 Windows 上,您还需要在构建静态库或可执行文件时定义 GLEW_STATIC 预处理器令牌,并在构建 dll 时定义 GLEW_BUILD 预处理器令牌

另见GLEW Linker Errors (undefined reference to `__glewBindVertexArray')的答案

【讨论】:

  • 我使用 SDL2 尝试了类似的操作,但仍然出现相同的错误,我将代码放在那里,也许您可​​以看到我看不到的东西?
  • 好的,我尝试了 SDL_GetError 以查看 SDL_Init 是否有效,它返回的值为 0,所以它确实有效。我尝试在m_windowm_glContext 之后添加SDL_GL_MakeCurrent,但它仍然给了我对glClearglClearColorundefined reference to 错误。这只是我的代码的问题吗?我只需要知道这是我的代码还是我设置所有内容的方式。如果这只是我的代码,我可能会弄清楚,但如果我的设置有问题(.a.dll 以及链接器等......)那么我需要弄清楚。虽然我很确定这是我的代码?
  • 所以我所拥有的没有什么问题吗?唔。就像提到的“glewInit()”有效,但“glClear”无效。 SDL2 也可以。所以我不认为这是我的设置?这真的很奇怪
  • 我添加了 GLEW_STATIC 预处理器,但它仍然给出了同样的错误。我很确定这是我的代码,所以我会查看链接并尝试修复它。感谢您的帮助。
  • 好吧,显然这不是我的代码,它与链接器有关,但我最终修复了它。
【解决方案2】:

所以基本上要解决这个问题,你想从 glew 网站下载源代码并自己编译。您使用命令提示符进入您下载的文件夹的目录并按顺序逐行执行这些命令:

gcc -DGLEW_NO_GLU -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.o -c src/glew.c

gcc -nostdlib -shared -Wl,-soname,libglew32.dll -Wl,--out-imlib,lib/libglew32.dll.a -o lib/glew32.dll src/glew.o -L /mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32

最后:

gcc-ar cr lib/libglew32.a src/glew.o(虽然“gcc-”可能不需要,但它适合我)

完成左键单击项目并转到 Properties,然后在 C/C++ Build 下转到 settings ,然后在 MinGW C++ Linker 下单击 Libraries。到达那里后,确保您的 Library search path 正确(Eclipse 查找库的位置)然后在 Libraries 中一一输入:glew32 opengl32 glu32 glew32.dll SDL2 SDL2main SDL2_test

此外,当您从源代码编译时,您从网站下载的 glew 文件夹内的 lib 文件夹中应该有一个带有 .dll 而不是 .a 扩展名的 glew32,将其放入您的调试(创建您的 .exe 的位置)。对 SDL.dllnot.dll.a 执行相同的操作,并确保您拥有 glew 和 SDL 在 GCC C++ Compiler 下设置(也在 C/C++ Builder 的设置下)。它现在应该可以工作了。

【讨论】:

    猜你喜欢
    • 2013-07-28
    • 2021-12-23
    • 2021-11-18
    • 2015-11-26
    • 2019-07-29
    • 1970-01-01
    • 2020-06-27
    • 2016-10-06
    • 2014-02-04
    相关资源
    最近更新 更多