2013-10-06 45 views
0

我嘗試在MacOS 10.6.8上編譯已在Linux/Debian 7.0上運行的應用程序。此代碼使用Qt框架與GPU/OPenCL和OpenGL庫。MacOS上的Qt/OpenGL/GPU應用程序編譯問題10.6

,但我得到這個文件頭(GLWidget.hpp)(我把原來這裏Linux版)上編譯問題:

#ifndef GLWIDGET_H 
#define GLWIDGET_H              

#include <QGLWidget>            
#include <GL/glu.h> 
#include <QTimer>              
#include "NBody.hpp"             
#include "Timer.h" 

class GLWidget : public QGLWidget          
{ 
    Q_OBJECT 

public:  
    GLWidget(QWidget *parent = NULL);  



    ~GLWidget(); 

... 

在這個版本中,我已經在Mac OS編譯:

/usr/bin/g++-4.2 -c -pipe -O2 -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.6 -Wall -W -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/opt/local/include -I/Developer/GPU\ Computing/OpenCL/common/inc -I/opt/local/share/qt4/mkspecs/macx-g++ -I. -I. -I/opt/local/Library/Frameworks/QtCore.framework/Versions/4/Headers -I/opt/local/Library/Frameworks/QtGui.framework/Versions/4/Headers -I/opt/local/Library/Frameworks/QtOpenGL.framework/Versions/4/Headers -I. -I/opt/local/Library/Frameworks/QtOpenGL.framework/Versions/4/Headers -I/opt/local/Library/Frameworks/QtGui.framework/Versions/4/Headers -I/opt/local/Library/Frameworks/QtCore.framework/Versions/4/Headers -I/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers -I/System/Library/Frameworks/AGL.framework/Headers -I. -F/opt/local/Library/Frameworks -I//Developer/GPU\ Computing/shared/inc -I/System/Library/Frameworks/OpenCL.framework/Headers -o GLWidget.o GLWidget.cpp 
GLWidget.cpp: In member function ‘virtual void GLWidget::initializeGL()’: 
GLWidget.cpp:82: error: ‘GL_CLAMP_VERTEX_COLOR’ was not declared in this scope 
GLWidget.cpp:82: error: ‘glClampColor’ was not declared in this scope 
GLWidget.cpp: In function ‘bool loadPngImage(char*, int&, int&, bool&, GLubyte**)’: 
GLWidget.cpp:297: error: ‘png_infopp_NULL’ was not declared in this scope 
GLWidget.cpp:313: error: ‘png_infopp_NULL’ was not declared in this scope 
GLWidget.cpp:347: error: ‘png_voidp_NULL’ was not declared in this scope 
GLWidget.cpp:349: error: invalid use of incomplete type ‘struct png_info_def’ 
/opt/local/include/png.h:739: error: forward declaration of ‘struct png_info_def’ 
GLWidget.cpp:350: error: invalid use of incomplete type ‘struct png_info_def’ 
/opt/local/include/png.h:739: error: forward declaration of ‘struct png_info_def’ 
GLWidget.cpp:351: error: invalid use of incomplete type ‘struct png_info_def’ 
/opt/local/include/png.h:739: error: forward declaration of ‘struct png_info_def’ 
GLWidget.cpp:359: error: invalid use of incomplete type ‘struct png_info_def’ 
/opt/local/include/png.h:739: error: forward declaration of ‘struct png_info_def’ 
GLWidget.cpp:378: error: ‘png_infopp_NULL’ was not declared in this scope 
GLWidget.cpp: In member function ‘void GLWidget::draw()’: 
GLWidget.cpp:483: error: ‘GL_VERTEX_PROGRAM_POINT_SIZE_NV’ was not declared in this scope 
make: *** [GLWidget.o] Error 1 

實際上,glClampColor函數沒有在範圍內聲明。因此,我已搜查,其中該功能dclared,我發現它在該文件中:

/Developer/GPU Computing/C/common/inc/GL/glew.h 

然後,我在PATH中添加GLWidget.hpp它和它包括:

#ifndef GLWIDGET_H 
#define GLWIDGET_H 

#include <QGLWidget> 
#include <GL/glew.h> 
#include <QTimer> 
#include "NBody.hpp" 
#include "Timer.h" 

class GLWidget : public QGLWidget 
{ 
    Q_OBJECT 

public: 

    GLWidget(QWidget *parent = NULL); 

    ~GLWidget(); 

但現在,我得到以下錯誤:

/opt/local/bin/uic DiskGal_IC.ui -o ui_DiskGal_IC.h 
/opt/local/bin/uic YourGalaxy.ui -o ui_YourGalaxy.h 
/usr/bin/g++-4.2 -c -pipe -O2 -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.6 -Wall -W -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/opt/local/include -I/Developer/GPU\ Computing/OpenCL/common/inc -I/opt/local/share/qt4/mkspecs/macx-g++ -I. -I. -I/opt/local/Library/Frameworks/QtCore.framework/Versions/4/Headers -I/opt/local/Library/Frameworks/QtGui.framework/Versions/4/Headers -I/opt/local/Library/Frameworks/QtOpenGL.framework/Versions/4/Headers -I. -I/opt/local/Library/Frameworks/QtOpenGL.framework/Versions/4/Headers -I/opt/local/Library/Frameworks/QtGui.framework/Versions/4/Headers -I/opt/local/Library/Frameworks/QtCore.framework/Versions/4/Headers -I/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers -I/System/Library/Frameworks/AGL.framework/Headers -I. -F/opt/local/Library/Frameworks -I//Developer/GPU\ Computing/shared/inc -I/System/Library/Frameworks/OpenCL.framework/Headers -o DiskGal_IC.o DiskGal_IC.cpp 
In file included from GLWidget.hpp:5, 
       from YourGalaxy.h:30, 
       from DiskGal_IC.h:25, 
       from DiskGal_IC.cpp:1: 
//Developer/GPU Computing/shared/inc/GL/glew.h:66:2: error: #error gl.h included before glew.h 
//Developer/GPU Computing/shared/inc/GL/glew.h:69:2: error: #error glext.h included before glew.h 
In file included from GLWidget.hpp:5, 
       from YourGalaxy.h:30, 
       from DiskGal_IC.h:25, 
       from DiskGal_IC.cpp:1: 
//Developer/GPU Computing/shared/inc/GL/glew.h:5855: error: ‘GLint64EXT’ has not been declared 
//Developer/GPU Computing/shared/inc/GL/glew.h:5856: error: ‘GLuint64EXT’ has not been declared 
//Developer/GPU Computing/shared/inc/GL/glew.h:9020: error: ‘PFNGLCOPYTEXSUBIMAGE3DPROC’ does not name a type 
//Developer/GPU Computing/shared/inc/GL/glew.h:9021: error: ‘PFNGLDRAWRANGEELEMENTSPROC’ does not name a type 
//Developer/GPU Computing/shared/inc/GL/glew.h:9022: error: ‘PFNGLTEXIMAGE3DPROC’ does not name a type 
//Developer/GPU Computing/shared/inc/GL/glew.h:9023: error: ‘PFNGLTEXSUBIMAGE3DPROC’ does not name a type 
//Developer/GPU Computing/shared/inc/GL/glew.h:9025: error: ‘PFNGLACTIVETEXTUREPROC’ does not name a type 
//Developer/GPU Computing/shared/inc/GL/glew.h:9026: error: ‘PFNGLCLIENTACTIVETEXTUREPROC’ does not name a type 
... 

我不知道該怎麼辦,已通過QMAKE產生的Makefile我在我的.pro,QT += opengl。之後,我修改了它以包含其他頭文件/庫,如OpenCL。下面是這個Makefile的頂部:

CC   = /usr/bin/gcc-4.2 
CXX   = /usr/bin/g++-4.2 
DEFINES  = -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED 
CFLAGS  = -pipe -O2 -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.6 -Wall -W $(DEFINES) 
CXXFLAGS  = -pipe -O2 -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.6 -Wall -W $(DEFINES) 
GPU  = /Developer/GPU\ Computing 
INC_GSL  = /opt/local/include 
INCPATH  = -I$(INC_GSL) -I$(GPU)/OpenCL/common/inc -I/opt/local/share/qt4/mkspecs/macx-g++ -I. -I. -I/opt/local/Library/Frameworks/QtCore.framework/Versions/4/Headers -I/opt/local/Library/Frameworks/QtGui.framework/Versions/4/Headers -I/opt/local/Library/Frameworks/QtOpenGL.framework/Versions/4/Headers -I. -I/opt/local/Library/Frameworks/QtOpenGL.framework/Versions/4/Headers -I/opt/local/Library/Frameworks/QtGui.framework/Versions/4/Headers -I/opt/local/Library/Frameworks/QtCore.framework/Versions/4/Headers -I/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers -I/System/Library/Frameworks/AGL.framework/Headers -I. -F/opt/local/Library/Frameworks -I/$(GPU)/shared/inc -I/System/Library/Frameworks/OpenCL.framework/Headers 
LINK   = /usr/bin/g++-4.2 
LFLAGS  = -headerpad_max_install_names -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.6 
LIBS   = $(SUBLIBS) -F/opt/local/Library/Frameworks -F/opt/local/lib -F/System/Library/Frameworks -F/opt/local/Library/Frameworks -F/opt/local/lib -L/opt/local/lib -framework QtOpenGL -framework QtGui -framework QtCore -framework OpenGL -framework AGL -framework OpenCL -lgsl -lgslcblas -lfftw3 -L$(GPU)/shared/lib/darwin -lGLEW 
+0

嘗試更改標題順序,glew需要包含在gl.h e glext.h之前。 gl.h可能包含在qglwidget中,因此在你的情況下glew會包含它。這解釋了前兩個錯誤。 – AndrewBloom

回答

0

不要使用GLEW在OS X上它不會因道路OS X大有作爲實現OpenGL的 - 它提供的所有可用在編譯時的擴展,有不需要做運行時擴展加載。

如果在OS X上編譯軟件時沒有可用的擴展名,那麼您的運氣不好,因爲該平臺旨在爲所有Apple支持的硬件提供同類功能集(Hackintosh是另一回事)任何給定的版本,(例如,任何OS X 10.8安裝將提供OpenGL 3.2和相同的擴展集)。這就是爲什麼當你需要某些OpenGL功能時,你最終鎖定了OS X版本號。話雖如此,如果你在#include <OpenGL/gl3.h>並獲得OS X(10.7 +)上的OpenGL 3.2核心上下文,glClampColor (...)將被定義和使用。另外,如果您有OpenGL 3.2核心上下文,那麼GL_PROGRAM_POINT_SIZE_NV是不必要的,它是OpenGL 3.2的核心,非供應商特定的令牌從GL_VERTEX_PROGRAM_POINT_SIZE更名爲GL_PROGRAM_POINT_SIZE

+0

問題是我想使用GPU計算SDK(來自Nvidia)提供的OpenGL頭文件和庫,並且唯一包含glClampColor原型的頭文件是/ Developer/GPU Computing/C/common/inc/GL/glew.h – youpilat13

+0

然後你運氣不好,不能在OS X上做這件事,可悲的是。你爲什麼不想使用平臺附帶的OpenGL庫和頭文件?這是做這種事情的唯一便攜式方式。 –