我正在使用Eclipse,我最初从网站上下载了二进制文件,直到有人指出我需要从源代码构建它以使其与mingw一起工作,所以我做了,我得到了这些文件: glew32。 dll , libglew32.a , libglew32.dll.a
我将 glew32.dll 放到了调试文件夹中,并链接了这些库,但它没有用。
奇怪的部分: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_ */
答案 0 :(得分:0)
要设置GLEW,需要当前OpenGL Context(有关详情,请参阅Creating an OpenGL Context (WGL))。
可以OpenGL Context,SDL或GLFW轻松创建GLUT和窗口(有关详情,请参阅Initializing GLEW)。
如果您使用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,您必须使用glutInit
,并且可以按照初始化glew的说明操作。
SDL_GL_MakeCurrent( window, glContext );
注意,glfwInit
如果成功则返回glutInit(&argc, argv);
glutCreateWindow("OGL window");
:
GLFW_TRUE
创建OpenGL Context并使其成为当前上下文后,您必须初始化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 的设置下)。它现在应该工作。