2012-09-15 74 views
0

我是使用OpenGL和Qt Creator的新手,我一直在玩弄各種教程中提供的信息。但是,我從來沒有能夠找到OpenGL函數定義的實際位置!使用Qt時OpenGL模塊的位置

我在想,當我掛了OpenGL模塊中的qmake的文件是這樣的:被列入

QT += core gui opengl 

OpenGL的東西,但後來我想,當我再次讀到有關QGLWidget來繪圖。

那麼OpenGL API會被包含到我的代碼中?

P.S.我的操作系統是Windows 7,而我的顯卡是AMD Radeon HD 6250顯卡。

+0

請添加有關您的操作系統和GPU的信息。其相關。 –

+0

你是否需要這些聲明來自動完成或學習使用Qt的OpenGL? –

回答

3

QT變量用於將Qt模塊包含到您的項目中。通過添加opengl,您可以添加包含Qt代碼的Qt OpenGL模塊,該模塊使用OpenGL(以及指向它的鏈接)。如果通過「包含」來表示鏈接,則比Qt的OpenGL模塊(libQtOpenGL.so)鏈接各種OpenGL庫。此外,Qt模塊還包含Qt OpenGL模塊的頭文件,該模塊又包含OpenGL頭文件。

OpenGL頭文件和OpenGL庫是您的操作系統保留這些內容的任何位置。你的項目知道這些是因爲你的平臺的Qt mkspecs,無論它是什麼。在mkspecs中,包含路徑和鏈接路徑已經包含在內。

例如,現在我在Mac OS X上,並且Qt mkspecs安裝在/usr/local/Qt4.8/mkspecs中。這裏我有所有的平臺描述,通常你可以找到mac.conf,這是我平臺描述的一部分。它裏面你可以看到:當Qt Creator中(QMAKE)被要求出示一個Makefile的任何應用程序使用

QMAKE_INCDIR_OPENGL = /System/Library/Frameworks/OpenGL.framework/Headers \ 
    /System/Library/Frameworks/AGL.framework/Headers/ 

此信息。這樣你的應用程序就知道在哪裏可以找到OpenGL的頭文件。只有當您添加opengl模塊時,您的項目纔會自動將其添加到包含路徑中。

再舉一個例子,這是定義爲Linux平臺的一部分:

... 
QMAKE_INCDIR   = 
QMAKE_LIBDIR   = 
QMAKE_INCDIR_X11  = /usr/X11R6/include 
QMAKE_LIBDIR_X11  = /usr/X11R6/lib 
QMAKE_INCDIR_QT  = $$[QT_INSTALL_HEADERS] 
QMAKE_LIBDIR_QT  = $$[QT_INSTALL_LIBS] 
QMAKE_INCDIR_OPENGL = /usr/X11R6/include 
QMAKE_LIBDIR_OPENGL = /usr/X11R6/lib 
QMAKE_INCDIR_OPENGL_ES1 = $$QMAKE_INCDIR_OPENGL 
QMAKE_LIBDIR_OPENGL_ES1 = $$QMAKE_LIBDIR_OPENGL 
QMAKE_INCDIR_OPENGL_ES2 = $$QMAKE_INCDIR_OPENGL 
QMAKE_LIBDIR_OPENGL_ES2 = $$QMAKE_LIBDIR_OPENGL 
QMAKE_INCDIR_EGL  = 
QMAKE_LIBDIR_EGL  = 
QMAKE_INCDIR_OPENVG = 
QMAKE_LIBDIR_OPENVG = 
... 

我想你可以在你自己明白這是什麼意思;-)

因此,要回答你的問題:包含路徑和到OpenGL庫的鏈接路徑包含在Makefile中,可以爲您的應用程序生成Makefile文件,以獲取存儲在位於系統某處的mkspec文件中的信息。實際的OpenGL頭文件和庫位於系統的默認位置,這與Qt本身無關。如果您直接使用OpenGL庫(或者您可能不需要,取決於),則可能需要在源代碼中包含標頭,但包含路徑應​​該已經由您的mkspec文件提供。

編輯:看加入OpenGL的模塊時,什麼是自動發生的:這是命令行Qt Creator的使用編譯C++文件而不OpenGL的模塊(在Mac上):

g++ -c -pipe -g -gdwarf-2 -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -Wall -W -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Qt4.8/mkspecs/macx-g++ -I../TextEdit -I/Library/Frameworks/QtCore.framework/Versions/4/Headers -I/usr/include/QtCore -I/Library/Frameworks/QtGui.framework/Versions/4/Headers -I/usr/include/QtGui -I/usr/include -I. -I. -I../TextEdit -I. -F/Library/Frameworks -o main.o ../TextEdit/main.cpp 

現在這是什麼情況添加後:

g++ -c -pipe -g -gdwarf-2 -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -Wall -W -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Qt4.8/mkspecs/macx-g++ -I../TextEdit -I/Library/Frameworks/QtCore.framework/Versions/4/Headers -I/usr/include/QtCore -I/Library/Frameworks/QtGui.framework/Versions/4/Headers -I/usr/include/QtGui -I/Library/Frameworks/QtOpenGL.framework/Versions/4/Headers -I/usr/include/QtOpenGL -I/usr/include -I/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers -I/System/Library/Frameworks/AGL.framework/Headers -I. -I. -I../TextEdit -I. -F/Library/Frameworks -o main.o ../TextEdit/main.cpp 

您的項目已被告知在哪裏查找OpenGL標頭。

+0

很酷,與'QT + = opengl'鏈接和包含libQtOpenGL有什麼區別?這是否與QtOpenGL或QGLWidget頭相同? – ZERO

+0

我不明白「包括」是什麼意思。你不「包括」圖書館。 QGLWidget是一個位於Qt OpenGL模塊中的類。如果沒有與QT + = opengl一起添加的OpenGL模塊,您將無法使用它。 –

+0

更有意義。因此,我知道的像'glShadeModel()'和'glHint()'這樣的OpenGL文件中的函數都可以在鏈接QT + = opengl後使用,因爲它們在QGLWidget中? – ZERO

1

Qt不包含OpenGL API定義。它必須已經存在於操作系統中(通常與GPU驅動程序捆綁在一起)。

尋找你的GPU驅動程序或OS文檔的文檔。

+0

那麼這是否意味着當我向.pro文件添加'QT + = opengl'時,Qt項目會與OpenGL的東西鏈接,我可以調用所有的函數和其他好東西? – ZERO

+0

沒有。這意味着您可以調用操作系統中存在的任何OpenGL調用。這段代碼只是說明你在你的項目中使用了什麼Qt(Qt是biiiigggggg)。 –

+0

我不確定你在說什麼。那麼'QT + = opengl'將項目鏈接到OpenGL函數和其他東西? – ZERO

-1

嘗試使用「GLEW」,「glut」,「GLU」和「GL」而不是「opengl」,我不確定它如何與Qt Creator配合使用,但這些是opengl的鏈接器標誌。

+0

過剩和GLU不是OpenGL。 –

+0

是的,從技術上講它不是,但是我沒有聽說有人用過glut或GLU沒有opengl ;-) –

+0

但是Qt仍然可以捆綁glut/GLU而不是OpenGL。用該信息更新您的答案。 –