#error gl.h включен перед glew.h

Поэтому я пытаюсь переместить свой код 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, пытаясь убедиться, что ничто не включает SFML до GLEW.

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

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


person GarrickW    schedule 20.12.2011    source источник
comment
Означает ли это, что теперь вы #включаете glew.h дважды, один раз из main.cpp и один раз из game.h? Я предполагаю, что glew.h не написан для этого (либо нет охранников, либо #pragma), поэтому вам придется либо добавить свои собственные охранники, либо позаботиться о том, чтобы включить их ровно один раз.   -  person Rup    schedule 20.12.2011
comment
У @Rup GLEW есть охранники #include. Это какая-то другая библиотека, включающая gl.h. Возможно СФМЛ.   -  person R. Martinho Fernandes    schedule 20.12.2011
comment
Нет, я удаляю его из main.cpp. Я предполагаю, что это может быть SFML, но у меня сложилось впечатление, что он не включает автоматически gl.h, поскольку для него есть несколько руководств, которые требуют, чтобы вы явно включали этот файл. Я поиграюсь с этим и посмотрю, решит ли это что-нибудь, но мне все еще нужно использовать SFML в main.cpp, по крайней мере, с моей текущей настройкой.   -  person GarrickW    schedule 20.12.2011
comment
Я только что попытался #включить Game.h перед ‹SFML/Graphics.hpp›, чтобы ничего, связанное с SFML, не было перед Game.h, но я все еще получаю ту же ошибку.   -  person GarrickW    schedule 20.12.2011
comment
Вы можете добавить #error included here в начало gl.h. Это должно дать вам ошибку с полной информацией о том, откуда произошло включение.   -  person Rup    schedule 20.12.2011


Ответы (2)


Некоторые другие библиотеки включают 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.

person R. Martinho Fernandes    schedule 20.12.2011
comment
Я попытался переместить #include "Game.h" выше #include <SFML/Graphics.hpp> в main.cpp (я отредактирую основной пост, чтобы продемонстрировать), но это не имело значения. Я не очень хорошо знаком с тем, как работает #include Things, поэтому я мог что-то упустить. - person GarrickW; 20.12.2011
comment
@GarrickW Может быть, это какой-то другой заголовок? Можете ли вы проверить вкладку «Журнал сборки» в Code::Blocks и опубликовать сообщения, которые выглядят как «В файле, включенном из ...»? Это может помочь найти виновного. - person R. Martinho Fernandes; 20.12.2011
comment
А-ХА! Нашел - оказывается проблема в Game.cpp. Там я по какой-то причине включил <SFML/Graphics.hpp> над Game.h. Я не знал, что файлы .cpp для классов были скомпилированы до заголовков для того же класса, хотя теперь, когда я об этом думаю... Мне нужно многому научиться. Спасибо! - person GarrickW; 20.12.2011
comment
@GarrickW рекомендуется всегда включать X.hpp первым в X.cpp. Помимо того, что он не вызывает эту раздражающую проблему, он также гарантирует, что ваш .hpp включает в себя все необходимое для работы. - person R. Martinho Fernandes; 20.12.2011
comment
@GarrickW #include заменяется содержимым включенного файла, поэтому файлы заголовков компилируются с каждым файлом, который их включает. - person josefx; 21.12.2011

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

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

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

person Mario    schedule 20.12.2011