簡體   English   中英

使用glew和mingw時未定義參考?

[英]Undefined reference when using glew and mingw?

我使用的是Eclipse,我最初是從網站上下載二進制文件的,直到有人指出我需要從源代碼進行構建才能使其與mingw一起使用,所以我這樣做了,我得到了以下文件: glew32.dlllibglew32.a ,和libglew32.dll.a

我將glew32.dll放到了debug文件夾中,並鏈接了庫,但是它沒有用。

奇怪的部分: 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_ */

要設置GLEW ,當前OpenGL上下文需要(請參閱創建OpenGL上下文(WGL)了解更多信息)。

創建OpenGL上下文和窗口

可以通過SDLGLFWGLUT輕松創建OpenGL上下文和窗口(有關更多信息,請參見初始化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

SDL_GL_MakeCurrent( window, glContext );

初始化GLUT

要設置GLUT,您必須使用glutInit並且可以按照初始化毛刺的說明進行操作

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上下文並使其成為當前上下文之后,必須初始化glew

設置GLEW

請注意,如果成功, glewInit返回GLEW_OK

if ( glewInit() != GLEW_OK )
    return;

要正確鏈接GLEW庫,您必須設置適當的預處理器定義

在Windows中,您還需要定義GLEW_STATIC建立一個靜態庫或可執行文件時預處理記號和GLEW_BUILD預處理程序標記構建DLL時

另請參見GLEW鏈接器錯誤的答案(對`__glewBindVertexArray'的未定義引用)

因此,基本上要解決此問題,您想從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 (盡管可能不需要“ gcc- ”,但對我而言)

完成該操作后,左鍵單擊項目並轉到“ 屬性” ,然后在“ C / C ++構建”下轉到設置 ,然后在“ MinGW C ++鏈接器”下單擊“ 庫” 一旦到達,請確保您的庫搜索路徑正確(Eclipse查找庫的位置),然后在庫中一一輸入: glew32 opengl32 glu32 glew32.dll SDL2 SDL2main SDL2_test

同樣,當您從源代碼編譯時,在從網站下載的glew文件夾中的lib文件夾中的lib文件夾中應該存在一個帶有.dll而不是.a擴展名的glew32,並將其放入調試(創建.exe位置)中。 .dll 而不是 SDL.dll.a進行相同的.dll.a ,並確保已在GCC C ++編譯器 (也在C / C ++ Builder的設置下)中設置了glewSDL的包含文件夾。 現在應該可以工作了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM