0

我是使用 OpenGL 和 Qt Creator 的新手,我一直在研究从各种教程中获得的信息。但是,我始终无法找出 OpenGL 函数定义的实际位置!

我在想,当我像这样将 opengl 模块链接到 qmake 文件时:

QT += core gui opengl

OpenGL 的东西被包括在内,但是当我阅读 QGLWidget 时我又想到了。

那么 OpenGL API 在哪里包含在我的代码中?

PS 我的操作系统是 Windows 7,我的显卡是 AMD Radeon HD 6250 Graphics。

4

3 回答 3

3

QT 变量用于将 Qt 模块包含到您的项目中。通过添加 opengl,您添加了 Qt OpenGL 模块,其中包含使用 OpenGL 的 Qt 代码(以及指向它的链接)。如果“包含”是指链接,那么 Qt 的 OpenGL 模块 (libQtOpenGL.so) 会链接各种 OpenGL 库。此外,Qt 模块包括 Qt OpenGL 模块的头文件,而后者又包括 OpenGL 头文件。

OpenGL 头文件和 OpenGL 库位于您的操作系统保留的任何位置。你的项目知道这些在哪里,因为你的平台有 Qt mkspecs,不管它是什么。在 mkspecs 中,包含路径和链接路径已经包含在内。

例如,现在我在 Mac OS X 上,Qt mkspecs 安装在 /usr/local/Qt4.8/mkspecs 中。这里我有所有的平台描述,在 common 下你可以找到 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 库的包含路径和链接路径包含在 Makefile 中,为您的应用程序生成,获取存储在系统某处的 mkspec 文件中的信息。实际的 OpenGL 头文件和库位于系统的默认位置,这与 Qt 本身无关。如果您直接使用 OpenGL 库,则可能需要在源代码中包含标头(或者您可能不需要,这取决于),但包含路径应​​该已经由您的 mkspec 文件提供。

编辑:看看添加 opengl 模块时会自动发生什么:这是 Qt Creator 用于编译没有 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 不包含 OpenGL API 定义。它必须已经存在于操作系统中(通常与 GPU 驱动程序捆绑在一起)。

查找您的 gpu 驱动程序或操作系统文档的文档。

于 2012-09-15T18:56:59.943 回答
-1

尝试“GLEW”、“glut”、“GLU”和“GL”而不是“opengl”,我不确定它如何与 Qt Creator 一起使用,但这些是 opengl 的链接器标志。

于 2012-09-15T18:59:53.287 回答