Проблемы при компиляции приложения на c с использованием QT и OpenGL

#c #qt #opengl #g #qglwidget

#c #qt #opengl #g #qglwidget

Вопрос:

Я следую этому руководству по созданию простого приложения 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(intamp;, 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 constamp;)'
/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
  

Ответ №1:

Файл .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)

Короткий файл .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:

Похоже, у вас ошибка компоновщика. Хотя я не использовал 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`  
  

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

Ответ №3:

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

Ответ №4:

Я НАСТОЯТЕЛЬНО рекомендую вам использовать qmake! В противном случае вам придется вручную вызывать moc , uic , и rcc самостоятельно!