【发布时间】:2017-08-03 00:48:55
【问题描述】:
我使用的是 Eclipse,我最初是从网站下载二进制文件,直到有人指出我需要从源代码构建它才能使其与 mingw 一起使用,所以我这样做了,我得到了这些文件:glew32. dll、libglew32.a 和 libglew32.dll.a
我将 glew32.dll 放入调试文件夹,并链接了库,但它不起作用。
奇怪的部分:GLenum status = glewInit(); 有效,但 glClearColor 和 glClear 无效,当我尝试调用它们时出现 undefined reference to 错误。
请看以下截图: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_ */
【问题讨论】:
-
我不知道还能问这个。它很简短,而且很重要。另外,如果您能帮助我解决这个问题,我将不胜感激。
-
这意味着当我调用它们时它们不起作用,我得到一个“未定义的引用”错误,这很奇怪,因为 'glewInit();'作品。就像它如何能够调用 'glewInit():' 而不是 'glClear'?
-
基本上它在我调用函数的行上给了我“未定义的引用”错误。但是当我调用 'glewInIt():' 函数时,它并没有给我一个“未定义的引用”错误。他们在帖子中提到的所有 3 个函数都属于“glew”,那么为什么只有 1 个可以工作,但我得到了其他函数的“未定义参考”?
-
glew 库和您的应用程序是否使用相同的编译器和相同的目标(32/64 位)编译?我建议不要使用预构建 glew lib,而是自己构建它或将源添加为任何其他文件。