2016-02-29 122 views
0

很抱歉,如果這是一個非常基本的問題,但我很困惑:
我使用Visual Studio和我創建一個自定義QOpenGLWidget類(從基類繼承),和我的問題是:定製QOpenGLWidget和GLEW包括

  • 如果我在我的自定義類添加#include <QOpenGLWidget>,並且還添加了#includeglew.h,我可以訪問glew.h
  • 定義的東西,但如果我在我的自定義類中添加#include <QtWidgets>(我雖然會覆蓋QOpenGLWidget噸∞),那麼我無法訪問什麼是glew.h定義,我看到「標識符未定義」錯誤(例如,爲glGenVertexArrays

有人能告訴我什麼,我在這裏失蹤?我猜測,包括我只需要(#include <QOpenGLWidget>)比<QtWidgets>中的很多東西要好,但爲什麼它應該阻止我訪問glew.h中定義的內容?

任何幫助表示讚賞

+0

請注意'#include '意味着一個'#include ',它反過來''包括',它又包含一些OpenGL頭文件。也許'glew.h'有一些'#ifndef'保護被觸發。 – peppe

+0

順便說一句,你確定你需要GLEW嗎? – peppe

+0

@peppe我想我需要GLEW,因爲我打電話直接OpenGL API函數,而且我沒有使用Qt中的包裝。我錯過了什麼嗎? – Farzad

回答

1

不能同時包括Qt的OpenGL的包裝OpenGL loading library頭。不同的.cpp文件可以包含不同的標題,但相同的.cpp不能。所以你將不得不選擇你想使用的:GLEW或者Qt的OpenGL包裝器。

這是行不通的原因是因爲裝載機通常使用包含防護,防止您意外地包括<GL/gl.h>或類似的標頭。加載庫往往是獨佔的,因爲它們通常定義與其他OpenGL頭文件相同的符號。如果他們不阻止你這樣做,如果你試圖包含兩者,你可能會得到多重定義的符號錯誤。

Qt的OpenGL包裝本身就是一個加載庫。所以它也有相同的排除技巧,定義了GLEW和其他裝載機將使用的包含警衛。因此,您不能在同一個.cpp文件中使用兩者。