Проблемы компиляции приложения c ++ с использованием QT и OpenGL - PullRequest
3 голосов
/ 04 октября 2011

Я следую этому руководству для создания простого приложения OpenGl на C ++ с использованием QT.

Я пытаюсь скомпилировать приложение, используя g ++ и командную строку, но получаю следующие ошибки:

/tmp/ccH2KFoZ.o: In function `GLWidget::GLWidget(QWidget*)':
GLWidget.cpp:(.text+0x38): undefined reference to `QGLWidget::QGLWidget(QWidget*, QGLWidget const*, QFlags<Qt::WindowType>)'
GLWidget.cpp:(.text+0x41): undefined reference to `vtable for GLWidget'
GLWidget.cpp:(.text+0x4b): undefined reference to `vtable for GLWidget'
GLWidget.cpp:(.text+0x5e): undefined reference to `QGLWidget::setMouseTracking(bool)'
GLWidget.cpp:(.text+0x6f): undefined reference to `QGLWidget::~QGLWidget()'
/tmp/ccH2KFoZ.o: In function `GLWidget::GLWidget(QWidget*)':
GLWidget.cpp:(.text+0xbe): undefined reference to `QGLWidget::QGLWidget(QWidget*, QGLWidget const*, QFlags<Qt::WindowType>)'
GLWidget.cpp:(.text+0xc7): undefined reference to `vtable for GLWidget'
GLWidget.cpp:(.text+0xd1): undefined reference to `vtable for GLWidget'
GLWidget.cpp:(.text+0xe4): undefined reference to `QGLWidget::setMouseTracking(bool)'
GLWidget.cpp:(.text+0xf5): undefined reference to `QGLWidget::~QGLWidget()'
/tmp/ccH2KFoZ.o: In function `GLWidget::resizeGL(int, int)':
GLWidget.cpp:(.text+0x1e1): undefined reference to `gluOrtho2D'
/tmp/ccH2KFoZ.o: In function `GLWidget::keyPressEvent(QKeyEvent*)':
GLWidget.cpp:(.text+0x2dd): undefined reference to `QWidget::close()'
/tmp/ccDIuk1w.o: In function `main':
main.cpp:(.text+0x29): undefined reference to `QApplication::QApplication(int&, char**, int)'
main.cpp:(.text+0x6a): undefined reference to `QApplication::exec()'
main.cpp:(.text+0xa0): undefined reference to `QApplication::~QApplication()'
main.cpp:(.text+0xb8): undefined reference to `QApplication::~QApplication()'
/tmp/ccDIuk1w.o: In function `QWidget::resize(int, int)':
main.cpp:(.text._ZN7QWidget6resizeEii[QWidget::resize(int, int)]+0x2d): undefined reference to `QWidget::resize(QSize const&)'
/tmp/ccDIuk1w.o: In function `GLWidget::~GLWidget()':
main.cpp:(.text._ZN8GLWidgetD1Ev[GLWidget::~GLWidget()]+0x13): undefined reference to `vtable for GLWidget'
main.cpp:(.text._ZN8GLWidgetD1Ev[GLWidget::~GLWidget()]+0x1d): undefined reference to `vtable for GLWidget'
main.cpp:(.text._ZN8GLWidgetD1Ev[GLWidget::~GLWidget()]+0x28): undefined reference to `QGLWidget::~QGLWidget()'
collect2: ld returned 1 exit status

Я пытался найти решение, но все решения, которые я могу предложить, - это изменение файла .pro, который, как я полагаю, используется Netbeans или Codeblocks, ни один из которых я не использую.

Какие правильные флаги командной строки нужно передать g ++, чтобы я мог скомпилировать это приложение?

Вот команда g ++, которую я сейчас использую:

g++ *.cpp  -I/usr/include/qt4 -I/usr/include/qt4/Qt -I/usr/include/QtCore -I/usr/include/QtGui -lGL 

Редактировать : В итоге я использовал файл проекта, который выглядит следующим образом.

TEMPLATE = app
TARGET = glQt
QT += opengl

HEADERS += \
    GLWidget.h

SOURCES += \
    GLWidget.cpp \
    main.cpp

Ответы [ 4 ]

7 голосов
/ 04 октября 2011

Файл .pro необходим QMake, приложению make, распространяемому с Qt.Этот pro-файл определяет все файлы, необходимые для сборки вашего проекта, а также модули Qt.

Подробнее о qmake и файле .pro здесь: http://qt -project.org / doc / qt-4.8 / qmake-manual.html

Если вы установите IDE QtCreator, задача изменения файла .pro и компиляции вашего приложения будет немного проще.

После того, как выизменив файл .pro, вы обычно создаете приложение Qt с помощью команды qmake, которая создает готовый файл make для использования вашей системой (в Windows он также может создавать решения .sln для Visual Studio)

Aкороткий .pro файл из одного из моих проектов:

TEMPLATE = app
TARGET = icat2browser
QT += network webkit <-- add here the opengl module
DEFINES += QT_LARGEFILE_SUPPORT

HEADERS += \
    qicat2networkaccessmanager.h \
    ctimeline.h \
    cobjectsview.h \
    cicat2WebResponse.h \
    cicat2usersdialog.h \
    cicat2previewdialog.h \
    cicat2login.h \
    cicat2clients.h \
    cicat2browser.h \

SOURCES += \
    qicat2networkaccessmanager.cpp \
    main.cpp \
    ctimeline.cpp \
    cobjectsview.cpp \
    cicat2WebResponse.cpp \
    cicat2usersdialog.cpp \
    cicat2previewdialog.cpp \
    cicat2login.cpp \
    cicat2clients.cpp \
    cicat2browser.cpp \
2 голосов
/ 04 октября 2011

Похоже, у вас ошибка компоновщика.Хотя я не использовал Qt, но из-за того, как вы его компилируете, похоже, что вы не связываете библиотеки Qt.Попробуйте связать библиотеки Qt при создании примера следующим образом (не проверено):
g++ *.cpp -I./ -I/usr/include/qt4 -I/usr/include/qt4/Qt -I/usr/include/QtCore -I/usr/include/QtGui -lGL -lQtCore -lQtGui -lQtOpenGL
Я предполагаю, что вы установили пакеты разработки для библиотек Qt, и в этом случае, скорее всего, у вас будет pkg-config filesт.е. .pc файлов в вашей системе в /usr/lib/pkgconfig.Попробуйте скомпилировать следующим образом (не проверено):

g++ *.cpp -I./ `pkg-config --cflags --libs QtOpenGL`  

Надеюсь, это поможет!

1 голос
/ 04 октября 2011

Я предлагаю вам использовать qmake для генерации правильного Makefile для вашей установки Qt. Использование QtCreator упрощает это. Напишите файл .pro, который состоит из 5 строк кода, и не забудьте добавить QT + = opengl. Затем запустите qmake и сделайте.

0 голосов
/ 04 октября 2011

I HIGHLY рекомендуем использовать qmake! В противном случае вам придется вручную вызывать moc, uic и rcc самостоятельно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...