0

Qt CreatorでOpenGLを使用するのは初めてで、さまざまなチュートリアルから得た情報で遊んでいます。しかし、OpenGL関数の定義が実際にどこにあるのかを知ることはできませんでした。

私がopenglモジュールを次のようにqmakeファイルにリンクしたとき、私は考えていました:

QT += core gui opengl

OpenGLのものが含まれていましたが、QGLWidgetについて読んでいたときにもう一度考えました。

では、OpenGL APIはどこで私のコードに含まれるようになりますか?

PS私のOSはWindows7で、グラフィックカードはAMD RadeonHD6250グラフィックスです。

4

3 に答える 3

3

QT変数は、Qtモジュールをプロジェクトに含めるために使用されます。openglを追加すると、OpenGL(およびそれにリンク)を使用するQtコードを含むQtOpenGLモジュールが追加されます。「インクルード」とはリンクを意味する場合、QtのOpenGLモジュール(libQtOpenGL.so)がさまざまなOpenGLライブラリをリンクします。また、QtモジュールにはQt OpenGLモジュールのヘッダーが含まれ、QtOpenGLモジュールにはOpenGLヘッダーが含まれます。

OpenGLヘッダーとOpenGLライブラリは、OSがそれらを保持している場所ならどこにでもあります。プロジェクトは、プラットフォームのQt mkspecsが何であれ、それらがどこにあるかを認識しています。mkspecsには、インクルードパスとリンクパスがすでに含まれています。

たとえば、今私はMac OS Xを使用しており、Qtmkspecsは/usr/local/Qt4.8/mkspecsにインストールされています。ここにすべてのプラットフォームの説明があります。共通して、私のプラットフォームの説明の一部であるmac.confを見つけることができます。その中にあなたは見ることができます:

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

この情報は、Qt Creator(qmake)が任意のアプリケーションのMakefileを作成するように求められたときに使用されます。このようにして、アプリケーションは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ライブラリへのインクルードパスとリンクパスが、システムのどこかにあるmkspecファイルに格納されている情報を取得してアプリケーション用にqmakeが生成するMakefileに含まれます。実際のOpenGLヘッダーとライブラリは、システムのデフォルトの場所にあり、これはQt自体とは何の関係もありません。OpenGLライブラリを直接使用する場合(または必要ない場合もあります)、ソースコードにヘッダーを含める必要がある場合がありますが、インクルードパスはすでにmkspecファイルによって提供されている必要があります。

編集:openglモジュールを追加すると自動的に何が起こるかを見てください:これは、QtCreatorがopenglモジュールなしでC++ファイルをコンパイルするために使用するコマンドラインです(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ヘッダーを探す場所を教えられています。

于 2012-09-15T23:54:33.790 に答える
1

QtにはOpenGLAPI定義が含まれていません。OSにすでに存在している必要があります(通常はGPUドライバーにバンドルされています)。

gpuドライバーまたはOSドキュメントのドキュメントを探します。

于 2012-09-15T18:56:59.943 に答える
-1

「opengl」の代わりに「GLEW」、「glut」、「GLU」、「GL」を試してください。QtCreatorでどのように機能するかはわかりませんが、これらはopenglのリンカーフラグです。

于 2012-09-15T18:59:53.287 に答える