【问题标题】:#error gl.h included before glew.h#error gl.h 包含在 glew.h 之前
【发布时间】:2012-01-24 17:24:10
【问题描述】:

所以我试图将我的 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 &lt;GL/glew.h&gt;去掉,放到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>

不幸的是,这并没有帮助(这里没有我没有提到的其他内容)。

【问题讨论】:

  • 这是否意味着您现在 #include glew.h 两次,一次来自 main.cpp,一次来自 game.h?我猜 glew.h 不是为此而写的(没有守卫或#pragma),所以你要么必须添加自己的守卫,要么注意只包含一次。
  • @Rup GLEW 有 #include 保护。这是其他一些包含 gl.h 的库。可能是 SFML。
  • 不,我从 main.cpp 中删除它。我想它可能是 SFML,但我的印象是它不会自动包含 gl.h,因为那里有一些教程希望您明确包含该文件。我会解决这个问题,看看是否能解决任何问题 - 但我仍然需要在 main.cpp 中使用 SFML,至少在我当前的设置中是这样。
  • 我刚刚在 之前尝试了#include "Game.h",这样在 Game.h 之前就不会出现任何与 SFML 相关的内容,但我仍然遇到同样的错误。跨度>
  • 您可以将#error included here 添加到gl.h 的顶部。这应该会给您一个错误,其中包含包含来自何处的完整详细信息。

标签: c++ opengl include codeblocks sfml


【解决方案1】:

其他一些库包括 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。

【讨论】:

  • 我尝试在 main.cpp 中将#include "Game.h" 移动到#include &lt;SFML/Graphics.hpp&gt; 上方(我将编辑主帖子以进行演示),但这没有任何区别。我对#include things 的工作方式不是很熟悉,所以我可能遗漏了一些东西。
  • @GarrickW 也许是其他标题?您可以检查 Code::Blocks 中的“构建日志”选项卡并发布看起来像“包含在...的文件中”的消息吗?这可能有助于找到罪魁祸首。
  • 啊哈!我找到了——原来问题出在 Game.cpp 中。在那里,出于某种原因,我在“Game.h”上方包含了&lt;SFML/Graphics.hpp&gt;。我不知道类的 .cpp 文件是在同一类的标头之前编译的,尽管现在我想起来了……我还有很多东西要学。谢谢!
  • @GarrickW 在 X.cpp 中始终首先包含 X.hpp 是个好主意。除了不会触发这个烦人的问题外,它还可以确保您的 .hpp 包含工作所需的所有内容。
  • @GarrickW #include 被包含文件的内容替换,因此头文件与包含它们的每个文件一起编译。
【解决方案2】:

我想我也遇到过这个问题。这在某种程度上是由 SFML(1.6?)包含 OpenGL 内容的方式引起的。

IIRC(已经有一段时间了,自从切换到 SFML2 后我不再需要 GLEW)这是由于 SFML 的 Graphics.hpp 也包括 GLEW.h。由于包含警卫,不应该发生,但我认为对于某些版本,这可能仍然会发生。您可能可以完全跳过 GLEW 的标头,因为无论如何它都包含在 SFML 中。

您运行的是哪个版本的 SFML? 1.6、2.0 还是带有新 API 的 2.0?另外,使用 GLEW 的原因是什么? SFML 缺少什么?也许这是最新版本中包含的内容,因此您不必也包含它。

【讨论】:

    猜你喜欢
    • 2014-03-13
    • 2013-03-06
    • 1970-01-01
    • 2014-07-03
    • 2011-08-11
    • 2012-08-20
    • 1970-01-01
    • 2011-04-15
    • 2022-01-20
    相关资源
    最近更新 更多