crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Проект с OpenGL.
alsav22
  опции профиля:
сообщение 29.11.2012, 3:37
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 6.5.2012
Пользователь №: 3365

Спасибо сказали: 0 раз(а)




Репутация:   0  


Попробовал собрать проект "OGLPyramid" к 23 главе книги: "Макс Шлее Qt4.5.Профессиональноепрограммирование на C++ (2010)". Проект с использованием OpenGL. Собираю в Студии 2010. Другие проекты делал в Студии без особых проблем. При компиляции компоновщик выдаёт ошибки типа:
Цитата
1>OGLPyramid.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__glShadeModel@4 в функции "protected: virtual void __thiscall OGLPyramid::initializeGL(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;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Snake174
  опции профиля:
сообщение 29.11.2012, 4:29
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 89
Регистрация: 18.4.2011
Из: Миасс
Пользователь №: 2613

Спасибо сказали: 9 раз(а)




Репутация:   0  


В .pro файле: LIBS += -lopengl32 -lglu32

Сообщение отредактировал Snake174 - 29.11.2012, 4:31
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alsav22
  опции профиля:
сообщение 29.11.2012, 4:45
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 6.5.2012
Пользователь №: 3365

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Snake174 @ 29.11.2012, 5:29) *
В .pro файле: LIBS += -lopengl32 -lglu32

Благодарю, но я без .pro файла делаю (в Студии Express). Решение нашёл. Нужно в Свойствах проекта - Компоновщик - Ввод - Дополнительные зависимости прописать: opengl32.lib (наверное, можно ещё и glu32.lib, хотя и так компилируется).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 29.11.2012, 8:55
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


alsav22, или без прописывания в настройках:


#pragma comment(lib,"opengl32.lib")



Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 29.11.2012, 18:15
Сообщение #5


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Алексей1153 @ 29.11.2012, 11:55) *
alsav22, или без прописывания в настройках:
#pragma comment(lib,"opengl32.lib")

с такими директивами нужно быть осторожным: они поддерживаются только в MSVS. другие компиляторы это не сожрут.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alsav22
  опции профиля:
сообщение 29.11.2012, 18:57
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 6.5.2012
Пользователь №: 3365

Спасибо сказали: 0 раз(а)




Репутация:   0  


Осталась одна заморочка. Делаю в Студии 2010 Express. В Release всё нормально. В Debug компилируется без ошибок. При запуске так. Если в Свойствах проекта - Компоновщик - Ввод -Дополнительные зависимости прописана библиотека QtOpenGL4.lib, то на консоли мелькает сообщение: "QWidget: Must construct a QApplication before a QPaintDevice" и программа закрывается без вывода окна. В инете по этому поводу пишут, что это происходит из-за несоответствия режима компиляции и библиотеки. Если прописать там: QtOpenGLd4.lib, то при запуске выскакивает: "Необработанное исключение....Нарушение прав доступа при чтении".
Остальные библиотеки там прописаны с d. В Release без d. Если делаю в Студии 2010 Ultimate, то там всё нормально. В ней можно создавать проекты Qt и в свойствах проекта всё автоматом прописывается. Посмотрел как там это библиотека прописана. Там всё как надо: для Debug с d, для Release - без. Почему в Express это исключение выскакивает непонятно.
Через qmake всё нормально собирается.

Этоа ошибка появляется при запуске именно в Студии. Если запускать непосредственно .exe файл, то всё нормально.

Вопрос снимаю. Была какая-то заморочка с проектом. Создал по новой, и всё нормально заработало.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 18:27