2011-12-20 3 views
8

Итак, я пытаюсь переместить мой код OpenGL из Main() в определенный класс, который будет обрабатывать 3D-графики только в случае необходимости. Раньше верхняя часть моего файла main.cpp выглядела так:#error gl.h включено до glew.h

#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 (почти) полностью внутри функций определенного класса без этого?

EDIT:

Я также пробовал эту конфигурацию в main.cpp, в попытке убедиться, что ничего не включает в себя SFML перед тем GLEW.

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

К сожалению, это не помогает (нет ничего другого, что я не упоминаю здесь).

+0

Означает ли это, что вы теперь # включаете glew.h дважды, один раз из main.cpp и один раз из game.h? Я предполагаю, что glew.h не написано для этого (либо без охранников, либо с #pragma), поэтому вам придется либо добавить своих собственных охранников, либо позаботиться о его включении ровно один раз. – Rup

+0

@Rup GLEW имеет #include охранников. Это еще одна библиотека, которая включает gl.h. Возможно, SFML. –

+0

Нет, я удаляю его из main.cpp. Я предполагаю, что это может быть SFML, но у меня создалось впечатление, что он не включал автоматически gl.h, так как для него есть некоторые учебные пособия, которые хотят, чтобы вы явно включили этот файл. Я буду разбираться с этим и посмотреть, что это все решает, но мне все еще нужно использовать SFML в main.cpp, по крайней мере, с моей текущей настройкой. – GarrickW

ответ

14

Другая библиотека включает в себя gl.h. Мое предположение было бы SFML. Убедитесь, что вы включили GLEW сначала в Game.h и проверьте места, где вы включили Game.h, чтобы убедиться, что вы не включаете SFML или что-то еще, что включает gl.h перед Game.h.

Если у вас есть что-то вроде:

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

Это будет эффективно включать gl.h до того GLEW.

+0

Я попробовал переместить '#include" Game.h "' вверх над '#include ' в main.cpp (я отредактирую главный пост для демонстрации), но это не имело никакого значения. Я не очень хорошо знаком с тем, как работает #include, поэтому может быть что-то, что мне не хватает. – GarrickW

+0

@GarrickW Может быть, это какой-то другой заголовок? Вы можете проверить вкладку «Создать журнал» в Code :: Blocks и опубликовать сообщения, которые выглядят как «In file included from ...»? Это может помочь найти виновника. –

+0

AH-HA! Я нашел его - оказалось, что проблема была в Game.cpp. Там я почему-то включил '' выше «Game.h». Я не знал, что файлы .cpp для классов были скомпилированы перед заголовками для того же класса, хотя теперь, когда я думаю об этом ... Мне нужно многому научиться. Благодаря! – GarrickW

1

Я думаю, что у меня тоже был этот вопрос. Это как-то вызвано тем, как SFML (1.6?) Включает в себя материал OpenGL.

IIRC (было некоторое время, и я не нуждаюсь в GLEW больше с момента перехода на SFML2), это связано с графическим интерфейсом SFML Graphics.hpp, включая GLEW.h. Не должно произойти из-за включения охранников, но я думаю, что с некоторыми версиями это может произойти. Возможно, вам удастся полностью пропустить заголовок GLEW, поскольку он включен в SFML в любом случае.

В какой версии SFML вы работаете? 1.6, 2.0 или 2.0 с новым API? Кроме того, в чем причина использования GLEW? Что-то, что вам не хватает в SFML? Возможно, это что-то включено в последнюю версию, поэтому вам не нужно включать его.