2011-12-20 19 views
8

Vì vậy, tôi đang cố gắng di chuyển mã OpenGL của mình từ Main() vào một lớp cụ thể sẽ chỉ xử lý đồ họa 3D khi cần thiết. Trước đây, đầu tệp main.cpp của tôi trông giống như sau:#error gl.h được bao gồm trước khi glew.h

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

Điều này làm việc đủ tốt. Những gì tôi đã cố gắng làm là di chuyển tất cả mã có liên quan đến OpenGL thành các phương thức của lớp Game. Vì vậy, tôi lấy ra #define GLEW_STATIC#include <GL/glew.h> từ trên, và đặt chúng vào Game.h, sao cho đầu Game.h bây giờ trông như thế này:

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

Khi tôi cố gắng biên soạn, tôi nhận được lỗi tiêu đề, #error gl.h included before glew.h.

Tại sao điều này xảy ra và làm cách nào tôi có thể sử dụng mã OpenGL (gần như) hoàn toàn bên trong các chức năng của một lớp cụ thể mà không xảy ra sự cố này?

EDIT:

Tôi cũng đã thử cấu hình này trong main.cpp, trong một nỗ lực để đảm bảo rằng không có gì bao gồm SFML trước GLEW.

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

Thật không may, điều đó không giúp ích (không có gì khác được bao gồm mà tôi không đề cập ở đây).

+0

Điều đó có nghĩa là bạn hiện đang #bao gồm glew.h hai lần, một lần từ main.cpp và một lần từ game.h? Tôi đoán glew.h không được viết cho điều đó (hoặc không có bảo vệ hoặC#pragma), do đó bạn sẽ phải thêm các vệ sĩ của riêng bạn hoặc cẩn thận để bao gồm nó chính xác một lần. – Rup

+0

@Rup GLEW có #include guards. Đó là một số thư viện khác bao gồm gl.h. Có thể là SFML. –

+0

Không, tôi xóa nó khỏi main.cpp. Tôi cho rằng nó có thể là SFML, nhưng tôi đã ấn tượng rằng nó không tự động bao gồm gl.h, vì có một số hướng dẫn ở đó cho nó mà muốn bạn bao gồm một cách rõ ràng tập tin đó. Tôi sẽ fiddle xung quanh với điều đó và xem nếu đó giải quyết bất cứ điều gì - nhưng tôi vẫn cần phải sử dụng SFML trong main.cpp, ít nhất là với thiết lập hiện tại của tôi. – GarrickW

Trả lời

14

Một số thư viện khác bao gồm gl.h. Tôi đoán là SFML. Hãy chắc chắn rằng bạn bao gồm GLEW đầu tiên trong Game.h và kiểm tra các địa điểm mà bạn bao gồm Game.h để đảm bảo bạn không bao gồm SFML hoặc một thứ khác bao gồm gl.h trước Game.h.

Nếu bạn có một cái gì đó như:

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

Nó sẽ có hiệu quả bao gồm gl.h trước GLEW.

+0

Tôi đã thử di chuyển '#include" Game.h "' lên trên '#include ' trong main.cpp (tôi sẽ chỉnh sửa bài chính để chứng minh), nhưng điều đó không có sự khác biệt. Tôi không quen thuộc với cách thứC# bao gồm mọi thứ hoạt động, vì vậy có thể có một cái gì đó tôi đang thiếu. – GarrickW

+0

@GarrickW Có lẽ đó là một số tiêu đề khác? Bạn có thể kiểm tra tab "Tạo nhật ký" trong Mã :: Khối và đăng các thông báo giống như "Trong tệp được bao gồm từ ..." không? Điều đó có thể giúp tìm ra thủ phạm. –

+0

AH-HA! Tôi đã tìm thấy nó - hóa ra là vấn đề nằm trong Game.cpp. Trong đó, tôi đã có một số lý do bao gồm '' lên trên "Game.h". Tôi không biết các tập tin .cpp cho các lớp học đã được biên soạn trước các tiêu đề cho cùng một lớp, mặc dù bây giờ tôi nghĩ về nó ... Tôi có rất nhiều thứ để học. Cảm ơn! – GarrickW

1

Tôi nghĩ rằng tôi cũng gặp vấn đề này một lần. Nó bằng cách nào đó gây ra bởi cách SFML (1.6?) Bao gồm các công cụ OpenGL.

IIRC (đã mất một thời gian và tôi không cần GLEW nữa kể từ khi chuyển sang SFML2), đó là do Graphics.hpp của SFML bao gồm GLEW.h, quá. Không nên xảy ra do bao gồm bảo vệ, nhưng tôi nghĩ rằng với một số phiên bản này vẫn có thể xảy ra. Bạn có thể bỏ qua hoàn toàn tiêu đề của GLEW, vì nó được bao gồm thông qua SFML.

Bạn đang chạy phiên bản SFML nào? 1.6, 2.0 hoặc 2.0 với API mới? Ngoài ra, lý do sử dụng GLEW là gì? Một cái gì đó bạn đang thiếu từ SFML? Có thể đó là một cái gì đó được bao gồm trong phiên bản mới nhất, do đó, giúp bạn không bao gồm nó quá.

Các vấn đề liên quan