#error gl.h在glew.h之前被包含

12

我正在将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>

很遗憾,这并没有帮助到你(除了我在这里提到的内容,没有其他被包含的东西)。

这是否意味着您现在从main.cpp和game.h两个文件中都#including glew.h?我猜glew.h没有为此编写(没有保护或#pragma),因此您将不得不添加自己的保护或确保仅包含一次。 - Rup
@Rup GLEW具有#include guards。导致包含gl.h的是另一个库,可能是SFML。 - R. Martinho Fernandes
不,我从main.cpp中将其删除了。我想它可能是SFML,但我印象中它并没有自动包含gl.h,因为有一些教程要求你显式地包含那个文件。我会试着调整一下看看是否解决了问题 - 但是至少在我的当前设置中,我仍然需要在main.cpp中使用SFML。 - GarrickW
我刚刚尝试在< SFML / Graphics.hpp>之前#包括“Game.h”,以便在Game.h之前没有任何与SFML相关的内容,但我仍然遇到相同的错误。 - GarrickW
你可以在 gl.h 的顶部添加 #error included here。这样会给你一个错误,其中包含了包含该文件的详细信息。 - Rup
2个回答

19

可能是其他库在包含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。


我尝试将 #include "Game.h" 移动到 #include <SFML/Graphics.hpp> 之前,放在 main.cpp 中(我将编辑主帖以演示),但这没有任何区别。我对 #include 的工作方式不是很熟悉,所以可能有些东西我没注意到。 - GarrickW
@GarrickW 或许是其他头文件引起的问题?你可以在 Code::Blocks 的“构建日志”选项卡中检查并发布类似于“从...包含文件”的消息,这可能有助于找到罪魁祸首。 - R. Martinho Fernandes
啊哈!我找到了——原来问题出在Game.cpp文件里。我不知道为什么在"Game.h"上面包含了"<SFML/Graphics.hpp>"。我不知道类的.cpp文件会在同一类的头文件之前编译,尽管现在想起来...我还有很多要学习的地方。谢谢! - GarrickW
@GarrickW,总是在X.cpp中首先包含X.hpp是个好主意。除了不会触发这个烦人的问题外,它还确保你的.hpp文件包含了所有需要工作的内容。 - R. Martinho Fernandes
2
@GarrickW 一个 #include 被替换为包含文件的内容,因此头文件会与包含它们的每个文件一起编译。 - josefx

1

我想我也曾经遇到过这个问题。这与SFML(1.6?)包含OpenGL的方式有关。

如果我没记错的话(已经有一段时间了,而且我不再需要GLEW,因为我转向了SFML2),这是因为SFML的Graphics.hpp也包含了GLEW.h。虽然由于include guards,这应该不会发生,但我认为在某些版本中可能仍然会发生。你可能可以完全跳过GLEW的头文件,因为它已经通过SFML包含了。

你使用的SFML版本是什么?1.6、2.0还是具有新API的2.0版本?此外,为什么要使用GLEW?是因为在SFML中缺少了一些东西吗?也许最新版本中已经包含了这些内容,所以你不必再自行添加。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接