Russian Qt Forum
Ноябрь 22, 2024, 21:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проект с OpenGL  (Прочитано 2124 раз)
alsav22
Гость
« : Ноябрь 29, 2012, 03:53 »

Попробовал собрать  проект "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;
}
Записан
alsav22
Гость
« Ответ #1 : Ноябрь 29, 2012, 04:46 »

Решение нашёл. Нужно в Свойствах проекта - Компоновщик - Ввод - Дополнительные зависимости прописать: opengl32.lib (наверное, можно ещё и glu32.lib, хотя и так компилируется).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 21.