2013-09-28 217 views
6

Tôi đang làm việc trên ứng dụng SDL2 sử dụng hồ sơ lõi OpenGL 3.2. Khi tôi biên dịch, tôi nhận được cảnh báo sau đây:SDL2, Mac OS X và OpenGL: Cách tránh bao gồm cả gl.h và gl3.h?

/System/Library/Frameworks/OpenGL.framework/Headers/gl.h:5:2: cảnh báo: #warning gl.h và gl3.h là cả hai đều được bao gồm. Trình biên dịch sẽ không gọi ra lỗi nếu sử dụng chức năng OpenGL bị xóa. [-Wcpp]

Tôi phải thừa nhận rằng SDL là bao gồm gl.h nơi nào đó, bởi vì tôi chỉ bao gồm như sau:

#define GL3_PROTOTYPES 

#include <OpenGL/gl3.h> 
#include <SDL2/SDL.h> 

Trong khi tôi chỉ đơn giản là có thể bỏ qua điều này, nó đã dẫn đến một lỗi khó tìm thấy khi tôi vô tình sử dụng giá trị enum không có sẵn trong cấu hình cốt lõi. Có cách nào để ngăn không cho gl.h được đưa vào không?

Trả lời

11

Hãy xem /System/Library/Frameworks/OpenGL.framework/Headers/gl.h, bạn sẽ thấy một bảo vệ khá chuẩn bao gồm dòng đầu tiên: #ifndef __gl_h_. Nếu bạn nhìn vào gl3.h, bạn sẽ nhận thấy mức độ bảo vệ tiêu chuẩn như nhau cho __gl3_h_. Cảnh báo này chỉ được kích hoạt khi cả hai được xác định và GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED không được xác định.

Cách dễ nhất để ngăn chặn bao gồm mọi thứ từ bên trong gl.h sẽ là #define __gl_h_ trước khi nó được bao gồm. Để tránh rối tung lên mã thực tế của bạn với một cái gì đó khó chịu như:

#ifdef __APPLE__ 
# define __gl_h_ 
# define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED 
#endif 

tôi sẽ đề nghị thêm -D__gl_h_ -DGL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED như một công tắc biên dịch để Makefile của bạn khi bạn nhắm mục tiêu OS X (do đó bất cứ đâu gl.h được gián tiếp bao gồm từ, nó không bao giờ làm bất cứ điều gì). Điều này thực sự không phải là cách đúng đắn để giải quyết vấn đề này và cảnh báo đó được tạo ra vì một lý do (mà bạn đã chỉ ra trong câu hỏi của bạn - mã thông báo OpenGL không dùng nữa sẽ không tạo ra cảnh báo/lỗi trình biên dịch khi cả hai tiêu đề được bao gồm).

Tôi nghĩ bản thân SDL2 phải có một số cơ chế tiền xử lý để làm những gì tôi đã làm ở trên với #ifdef __APPLE__ nhưng thay vào đó, việc này sẽ hoàn thành công việc. Nó không phải là lỗi bởi bất kỳ phương tiện để bao gồm cả hai, OS X chỉ cung cấp một cơ chế tiện dụng để tạo ra lỗi trình biên dịch khi mã thông báo không dùng nữa (ví dụ: GL_MODELVIEW) được sử dụng trong một dự án được cho là lõi 3+.

Trên các nền tảng khác cho dù bạn đang sử dụng lõi OpenGL 3+ không phải là màu đen và trắng tại thời gian biên dịch, do đó trình biên dịch không thể được sử dụng cho mục đích này. Đó là một trong những điều mà Apple làm chỉ vì họ có thể; "nghĩ khác."

+0

Câu trả lời hay. Dường như việc xác định '__gl_h_' gây ra một số vấn đề trong nội bộ trong SDL, nhưng đó là một vấn đề riêng biệt. Tôi sẽ xem những gì tôi có thể tìm thấy trực tiếp từ cộng đồng của họ. – Karl