2017-01-14 75 views
2

我建設使用OpenGL的glfw3項目。該程序確實編譯,並且運行時沒有錯誤。但是我得到的編譯器警告說,如glGenBuffersglBindBufferglBufferData,並且glEnableVertexAttribArray沒有被定義的功能。尋找到它這些功能在<GL/glext.h>所有聲明(其中包括在gl.h),它們在實際<GL/gl.h>與decalared出警告如glEnableglClearglClearColor正在編制GLFW3:警告:隱式聲明函數「glGenBuffers」

功能。

編譯(生成警告):

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

鏈接(無警告):

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

回答

2

你需要一個OpenGL loader,像glLoadGen

大多數平臺只支持與<GL/gl.h>頭一箇舊版本的OpenGL。在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

聖胡安,我不知所措我呢。我認爲GLFW充當OpenGL Loader? GLFW不提供GLEW的功能嗎? –

+0

GLFW沒有這樣做。 GLFW創建一個窗口,處理輸入等。GLFW實際上做的大部分與OpenGL本身無關。 –

+0

哦,我不知道。拿你的15號。 –