Попробовал собрать проект "OGLPyramid" к 23 главе книги: "Макс Шлее Qt4.5.Профессиональное программирование на C++ (2010)". Проект с использованием OpenGL. Собираю в Студии 2010. Другие проекты делал в Студии без особых проблем. При компиляции компоновщик выдаёт ошибки типа:
1>OGLPyramid.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__glShadeModel@4 в функции "protected: virtual void __thiscall OGLPyramid::initialize(void)" (initializeGL@OGLPyramid@@MAEXXZ)1>OGLPyramid.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__glEnable@4 в функции "protected: virtual void __thiscall OGLPyramid::initializeGL(void)" (?initializeGL@OGLPyramid@@MAEXXZ) ... и т.д.
, т.е. ошибки по поводу функций вида: glShadeModel(), glEnable(), glNewList(), glBegin() и пр. Прототипы этих функций Студия показывает в GL.h. Есть предположение, что компоновщик не находит реализаций. В свойствах проекта: Дополнительные каталоги включаемых файлов: C:\Ot\4.81\include\QtOpenGL, Дополнительные зависимости: QtOpenGL4.lib, QtOpenGLd4.lib. Подскажите, пожалуйста, что и где ещё нужно подключить, или чего не хватает.
//main.cpp
#include <QApplication>
#include "OGLPyramid.h"
// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
QApplication app(argc, argv);
OGLPyramid oglPyramid;
oglPyramid.resize(200, 200);
oglPyramid.show();
return app.exec();
}
//OGLPyramid.h
#ifndef _OGLPyramid_h_
#define _OGLPyramid_h_
#include <QGLWidget>
// ======================================================================
class OGLPyramid : public QGLWidget {
private:
GLuint m_nPyramid;
GLfloat m_xRotate;
GLfloat m_yRotate;
QPoint m_ptPosition;
protected:
virtual void initializeGL ( );
virtual void resizeGL (int nWidth, int nHeight);
virtual void paintGL ( );
virtual void mousePressEvent(QMouseEvent* pe );
virtual void mouseMoveEvent (QMouseEvent* pe );
GLuint createPyramid (GLfloat fSize = 1.0f );
public:
OGLPyramid(QWidget* pwgt = 0);
};
#endif //_OGLPyramid_h_
//OGLPyramid.cpp
#include <QtGui>
#include "OGLPyramid.h"
// ----------------------------------------------------------------------
OGLPyramid::OGLPyramid(QWidget* pwgt/*= 0*/) : QGLWidget(pwgt)
, m_xRotate(0)
, m_yRotate(0)
{
}
// ----------------------------------------------------------------------
/*virtual*/void OGLPyramid::initializeGL()
{
qglClearColor(Qt::black);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
m_nPyramid = createPyramid(1.2f);
}
// ----------------------------------------------------------------------
/*virtual*/void OGLPyramid::resizeGL(int nWidth, int nHeight)
{
glViewport(0, 0, (GLint)nWidth, (GLint)nHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10.0);
}
// ----------------------------------------------------------------------
/*virtual*/void OGLPyramid::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -3.0);
glRotatef(m_xRotate, 1.0, 0.0, 0.0);
glRotatef(m_yRotate, 0.0, 1.0, 0.0);
glCallList(m_nPyramid);
}
// ----------------------------------------------------------------------
/*virtual*/void OGLPyramid::mousePressEvent(QMouseEvent* pe)
{
m_ptPosition = pe->pos();
}
// ----------------------------------------------------------------------
/*virtual*/void OGLPyramid::mouseMoveEvent(QMouseEvent* pe)
{
m_xRotate += 180 * (GLfloat)(pe->y() - m_ptPosition.y()) / height();
m_yRotate += 180 * (GLfloat)(pe->x() - m_ptPosition.x()) / width();
updateGL();
m_ptPosition = pe->pos();
}
// ----------------------------------------------------------------------
GLuint OGLPyramid::createPyramid(GLfloat fSize/*=1.0f*/)
{
GLuint n = glGenLists(1);
glNewList(n, GL_COMPILE);
glBegin(GL_TRIANGLE_FAN);
qglColor(Qt::green);
glVertex3f(0.0, fSize, 0.0);
glVertex3f(-fSize, -fSize, fSize);
glVertex3f(fSize, -fSize, fSize);
qglColor(Qt::yellow);
glVertex3f(fSize, -fSize, -fSize);
qglColor(Qt::blue);
glVertex3f(-fSize, -fSize, -fSize);
qglColor(Qt::white);
glVertex3f(-fSize, -fSize, fSize);
glEnd();
glBegin(GL_QUADS);
qglColor(Qt::red);
glVertex3f(-fSize, -fSize, fSize);
glVertex3f(fSize, -fSize, fSize);
glVertex3f(fSize, -fSize, -fSize);
glVertex3f(-fSize, -fSize, -fSize);
glEnd();
glEndList();
return n;
}