所以我试图将我的OpenGL代码从Main()移动到一个特定的类中,该类只在必要时处理3D图形。以前,我的main.cpp文件的顶部看起来像这样:
#define GLEW_STATIC
#include <GL/glew.h>
#include <SFML/Graphics.hpp>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include "Game.h"
这很好用。我尝试做的是将所有与OpenGL相关的代码移动到Game
类的方法中。所以我从上面删除了#define GLEW_STATIC
和#include <GL/glew.h>
,并将它们放到Game.h中,这样Game.h的顶部现在看起来像这样:
#define GLEW_STATIC
#include <GL/glew.h>
#include <SFML/Graphics.hpp>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include "Environment.h"
当我尝试编译时,我得到标题错误#error gl.h included before glew.h
。
为什么会发生这种情况,如何在不发生这种情况的情况下(几乎)完全在特定类的函数内部使用OpenGL代码?
编辑:
我也在main.cpp中尝试过这个配置,试图确保在GLEW之前没有包含任何SFML。
#include <cstdlib>
#include <iostream>
#include <fstream>
#include "Game.h"
#include <SFML/Graphics.hpp>
不幸的是,这没有任何帮助(我没有在此提及其他任何内容)。
答案 0 :(得分:14)
其他一些库包括gl.h.我的猜测是SFML。确保在Game.h中首先包含GLEW并检查包含Game.h的位置,以确保在Game.h之前不包括SFML或包含gl.h的其他内容。
如果你有类似的话:
#include <something_that_includes_gl.h>
#include "Game.h"
它将在GLEW之前有效地包含gl.h。
答案 1 :(得分:1)
我想我也有过一次这个问题。这是由SFML(1.6?)包含OpenGL内容的方式引起的。
IIRC(已经有一段时间了,自从切换到SFML2后我不再需要GLEW)这也是由于SFML的Graphics.hpp,包括GLEW.h。不应该因为包括警卫而发生,但我认为在某些版本中这可能仍然会发生。您可能完全跳过GLEW的标题,因为它无论如何都包含在SFML中。
您运行的是哪个版本的SFML?使用新API的1.6,2.0或2.0?另外,使用GLEW的原因是什么?你在SFML中缺少什么?也许这是最新版本中包含的内容,因此您也不必包含它。