我正在关注this tutorial使用QT在C ++中构建一个简单的OpenGl应用程序。
我正在尝试使用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
答案 0 :(得分:7)
QMake需要.pro文件,这是与Qt一起发布的make app。 此专业文件指定了构建项目所需的所有文件,以及Qt模块。
有关qmake和.pro文件的更多信息,请访问:http://qt-project.org/doc/qt-4.8/qmake-manual.html
如果安装IDE QtCreator,修改.pro文件和编译应用程序的任务会更容易。
修改.pro文件后,通常使用qmake命令构建Qt应用程序,生成一个准备供系统使用的make文件(在Windows上它也可以为Visual Studio生成.sln解决方案)
我的一个项目的简短.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 \
答案 1 :(得分: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`
希望这有帮助!
答案 2 :(得分:1)
我建议您使用qmake为Qt安装生成正确的Makefile。使用QtCreator简化了这一点。写一个.pro文件,这是5行代码,记得添加QT + = opengl。然后运行qmake并make。
答案 3 :(得分:0)
我 HIGHLY 建议您使用qmake!否则,您必须自己手动拨打moc
,uic
和rcc
!