[英]Undefined reference when using glew and mingw?
我使用的是Eclipse,我最初是從網站上下載二進制文件的,直到有人指出我需要從源代碼進行構建才能使其與mingw一起使用,所以我這樣做了,我得到了以下文件: glew32.dll , libglew32.a ,和libglew32.dll.a
我將glew32.dll放到了debug文件夾中,並鏈接了庫,但是它沒有用。
奇怪的部分: GLenum status = glewInit();
可以,但是glClearColor
和glClear
不起作用,嘗試調用它們時得到錯誤的未定義引用 。
請查看以下屏幕截圖: http : //imgur.com/a/L8iNb和http://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)了解更多信息)。
可以通過SDL , GLFW或GLUT輕松創建OpenGL上下文和窗口(有關更多信息,請參見初始化GLEW )。
如果使用的是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,您必須使用glutInit
並且可以按照初始化毛刺的說明進行操作 。
glutInit(&argc, argv);
glutCreateWindow("OGL window");
注意,如果成功, 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 。
請注意,如果成功, glewInit
返回GLEW_OK
:
if ( glewInit() != GLEW_OK )
return;
要正確鏈接GLEW庫,您必須設置適當的預處理器定義 :
在Windows中,您還需要定義
GLEW_STATIC
建立一個靜態庫或可執行文件時預處理記號和GLEW_BUILD
預處理程序標記構建DLL時
因此,基本上要解決此問題,您想從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的設置下)中設置了glew和SDL的包含文件夾。 現在應該可以工作了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.