2011-12-20 14 views
8

私はOpenGLコードをMain()から、必要に応じて3Dグラフィックスを扱う特定のクラスに移動しようとしています。以前は、私のmain.cppファイルのトップは次のようになっていました:#error gl.h include glew.h

#define GLEW_STATIC 
#include <GL/glew.h> 
#include <SFML/Graphics.hpp> 
#include <cstdlib> 
#include <iostream> 
#include <fstream> 
#include "Game.h" 

これで十分でした。私が試みたのは、すべてのOpenGL関連のコードをGameクラスのメソッドに移動することでした。だから私はGame.hのトップは、次のようになりますように、上から#define GLEW_STATIC#include <GL/glew.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コードを(ほとんど)使うことができますか?

EDIT:

また、私は何もGLEW前SFMLが含まれていないことを確認してくださいしようとする試みで、main.cppににこの設定を試してみました。

#include <cstdlib> 
#include <iostream> 
#include <fstream> 
#include "Game.h" 
#include <SFML/Graphics.hpp> 

残念ながら、それは役に立たない(私がここで言及していないものは何も含まれていない)。

+0

glew.hをmain.cppから1回、game.hから1回2回#includeしていますか?私はglew.hがそのために(ガードも#pragmaも)書かれていないと思うので、あなた自身のガードを追加したり、それを一度だけ含めなければならない。 – Rup

+0

@Rup GLEWにはガードが#含まれています。 gl.hを含む他のライブラリです。おそらくSFML。 –

+0

いいえ、main.cppから削除します。私はそれがSFMLかもしれないと思いますが、あなたが明示的にそのファイルをインクルードすることを望むいくつかのチュートリアルがあるので、gl.hを自動的には含んでいないという印象を受けました。私はそれを耳にして、それが何かを解決するかどうかを見てみましょう。でも、少なくとも私の現在の設定では、main.cppでSFMLを使う必要があります。 – GarrickW

答えて

14

他のライブラリにはgl.hが含まれています。私の推測はSFMLだろう。 Game.hに最初にGLEWをインクルードして、Game.hの前にgl.hを含むSFMLやその他のものがないことを確認するためにGame.hをインクルードする場所を確認してください。あなたのようなものがある場合は

#include <something_that_includes_gl.h> 
#include "Game.h" 

を効果的GLEW前gl.hが含まれます。

+0

main.cppの中で '#include の上に' #include "Game.h" 'を上げようとしましたが(私はメインの投稿を編集してデモンストレーションします)、違いはありません。私は、物事を含む方法に密接に精通していないので、私は行方不明のものがあるかもしれません。 – GarrickW

+0

@ GarrickWそれは別のヘッダーですか? Code :: Blocksの "Build log"タブをチェックして "In file from ..."のようなメッセージを投稿できますか?その原因を見つけるのに役立つかもしれません。 –

+0

AH-HA!私はそれを見つけました - 問題はGame.cppにあったことが判明しました。そこには何らかの理由で ''の上に "Game.h"の上にあったものがありました。クラスのヘッダーの前に同じクラスの.cppファイルがコンパイルされていることはわかりませんでしたが、今はそれを考えています...私はたくさんのことを学びます。ありがとう! – GarrickW

1

私はこの問題も1度も起こったと思います。それはSFML(1.6?)にOpenGLのものが含まれている方法によって何らかの形で引き起こされます。

IIRC(SFML2に切り替えてからもう少しGLEWは必要ありませんでした)SFMLのGraphics.hpp、GLEW.hなどが原因です。ガードを含むために起こるべきではありませんが、私はいくつかのバージョンでこれがまだ起こるかもしれないと思います。とにかくSFMLに含まれているように、GLEWのヘッダーを完全にスキップすることは可能かもしれません。

実行しているSFMLのバージョンはどれですか? 1.6、2.0、または2.0の新しいAPIを使用していますか?また、GLEWを使用する理由は何ですか? SFMLに欠けているものがありますか?たぶんそれは最新のバージョンに含まれているものなので、あなたもそれを含める必要はありません。