使用glew和mingw时未定义的引用?

时间:2017-08-03 00:48:56

标签: c++ eclipse opengl glew

我正在使用Eclipse,我最初从网站上下载了二进制文件,直到有人指出我需要从源代码构建它以使其与mingw一起工作,所以我做了,我得到了这些文件: glew32。 dll libglew32.a libglew32.dll.a

我将 glew32.dll 放到了调试文件夹中,并链接了这些库,但它没有用。

奇怪的部分:GLenum status = glewInit();有效但glClearColorglClear不起作用,当我尝试调用它时,我得到未定义的错误引用。

请参阅以下屏幕截图: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_ */

2 个答案:

答案 0 :(得分:0)

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

创建OpenGL上下文和窗口

可以OpenGL ContextSDLGLFW轻松创建GLUT和窗口(有关详情,请参阅Initializing GLEW)。

初始化SDL

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

app.Map("/subpath", sub_app=> {
     sub_app.UseWhateverAuth(); // <= custom auth
     // ...
     sub_app.UseWhateverMiddleware();
     sub_app.UseMvc();
});

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

OpenGL上下文必须在使用之前成为当前上下文。因此使用SDL_GL_MakeCurrent

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 );

初始化GLUT

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

SDL_GL_MakeCurrent( window, glContext );

初始化GLFW

注意,glfwInit如果成功则返回glutInit(&argc, argv); glutCreateWindow("OGL window");

GLFW_TRUE

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

设置GLEW

请注意,如果成功,glewInit会返回if ( glfwInit() != GLFW_TRUE ) return; GLFWwindow *wnd = glfwCreateWindow( width, height, "OGL window", nullptr, nullptr ); if ( wnd == nullptr ) { glfwTerminate(); return; } glfwMakeContextCurrent( wnd );

GLEW_OK

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

  

在Windows上,您还需要在构建静态库或可执行文件时定义if ( glewInit() != GLEW_OK ) return; 预处理程序标记,并在构建dll时定义GLEW_STATIC预处理程序标记

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

的答案

答案 1 :(得分:0)

所以基本上解决这个问题你想从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-implib,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 (虽然&#34; gcc - &#34;可能不需要,但它适合我)

完成后左键单击项目并转到属性,然后在 C / C ++ Build 下转到设置,然后在 MinGW C ++链接器下单击。一旦确定图书馆搜索路径正确(Eclipse查找您的图书馆的地方),然后在图书馆中逐一输入: glew32 opengl32 glu32 glew32.dll SDL2 SDL2main SDL2_test

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