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."
Nguồn
2013-09-29 00:00:02
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