#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
самостоятельно!