2017-01-14 16 views
2

私はglfw3を使ってOpenGLでプロジェクトを構築しています。プログラムはコンパイルされ、エラーなしで実行されます。しかし、私は、glGenBuffersglBindBufferglBufferData、およびglEnableVertexAttribArrayのような関数は宣言されていないというコンパイラの警告を受けています。それを見ると、これらの機能はすべて、実際に<GL/gl.h>にdecalaredさGLFW3:警告:関数の暗黙の宣言 'glGenBuffers'

機能は、このようなglEnableglClearglClearColorよう警告して使用してコンパイルされている(gl.hに含まれている)<GL/glext.h>で宣言されています。

は(警告を生成します)コンパイル:

gcc -O0 -g3 -Wall -c -fmessage-length=0 -o main.o 

(何の警告)をリンクしない:

gcc -o test main.o `pkg-config --static --libs glfw3` 

答えて

2

あなたはglLoadGenのように、OpenGL loaderを必要としています。

ほとんどのプラットフォームでは、古いバージョンのOpenGLのみが<GL/gl.h>ヘッダーでサポートされています。 WindowsではOpenGL 1.1を、Linux/MesaならOpenGL 1.3を取得します。これは、これらのプラットフォームでダイナミックリンクが動作するためです。新しいバージョンのOpenGLの関数にリンクしていても、OpenGLの古いバージョンのシステムでプログラムを実行すると、プログラムはまったく実行されません。これは、人々にOpenGL関数を動的にロードさせることによって解決されます。 wglGetProcAddressglXGetProcAddress、または他の関数を使用して自分で行うことができます。glext.hはこれを行うのに役立つように設計されていますが、OpenGLローダーを使用する方が簡単です。

GLEWは、おそらく最も簡単な選択です。これは、ほとんどのパッケージマネージャーで使用できますが、コアコンテキストでは正しく機能しないためです。

(あなたが唯一のMacOS/iOS版をターゲットにしている場合は、あなたの代わりに弱いリンクを使用することができ、およびOpenGLローダーが必要ではないことに注意してください。)また

を、私は-Werrorでコンパイル推薦する、または少なくとも-Werror-implicit-function-declaration 、偶然の暗示的な宣言を避けることができます。

+0

Ohkay、私は崩壊しています。私はGLFWがOpenGLローダとして動作していると思いましたか? GLFWはGLEWの機能を提供していませんか? –

+0

GLFWはそれをしません。 GLFWはウィンドウを作成し、入力を処理します.GLFWが実際に行うことのほとんどは、OpenGL自体とは何の関係もありません。 –

+0

ああ、私はそれを知らなかった。あなたの15を取ってください。 –

関連する問題