Seite 1 von 1

QGLWidget + unresolved external symbols

Verfasst: 22. Januar 2010 19:06
von sacrif
Hi ich verwendet Qt4.5 unter VS2008 auf windows 7.

Ich habe ein größeres Programm bei dem ich beim compilieren die folgenden Fehlermeldungen bekomme.


1>------ Build started: Project: gradientEditor, Configuration: Debug Win32 ------
1>Linking...
1> Creating library C:\...\Debug\gradientEditor.lib and object C:\...\Debug\gradientEditor.exp
1>arthurwidgets.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QGLFormat::~QGLFormat(void)" (__imp_??1QGLFormat@@QAE@XZ) referenced in function "public: __thiscall ArthurFrame::ArthurFrame(class QWidget *)" (??0ArthurFrame@@QAE@PAVQWidget@@@Z)
1>arthurwidgets.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static void __cdecl QGLFormat::setDefaultFormat(class QGLFormat const &)" (__imp_?setDefaultFormat@QGLFormat@@SAXABV1@@Z) referenced in function "public: __thiscall ArthurFrame::ArthurFrame(class QWidget *)" (??0ArthurFrame@@QAE@PAVQWidget@@@Z)
1>arthurwidgets.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall QGLFormat::setAlphaBufferSize(int)" (__imp_?setAlphaBufferSize@QGLFormat@@QAEXH@Z) referenced in function "public: __thiscall ArthurFrame::ArthurFrame(class QWidget *)" (??0ArthurFrame@@QAE@PAVQWidget@@@Z)
1>arthurwidgets.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall QGLFormat::setAlpha(bool)" (__imp_?setAlpha@QGLFormat@@QAEX_N@Z) referenced in function "public: __thiscall ArthurFrame::ArthurFrame(class QWidget *)" (??0ArthurFrame@@QAE@PAVQWidget@@@Z)
1>arthurwidgets.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall QGLFormat::setStencil(bool)" (__imp_?setStencil@QGLFormat@@QAEX_N@Z) referenced in function "public: __thiscall ArthurFrame::ArthurFrame(class QWidget *)" (??0ArthurFrame@@QAE@PAVQWidget@@@Z)
1>arthurwidgets.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall QGLFormat::setSampleBuffers(bool)" (__imp_?setSampleBuffers@QGLFormat@@QAEX_N@Z) referenced in function "public: __thiscall ArthurFrame::ArthurFrame(class QWidget *)" (??0ArthurFrame@@QAE@PAVQWidget@@@Z)
1>arthurwidgets.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class QGLFormat __cdecl QGLFormat::defaultFormat(void)" (__imp_?defaultFormat@QGLFormat@@SA?AV1@XZ) referenced in function "public: __thiscall ArthurFrame::ArthurFrame(class QWidget *)" (??0ArthurFrame@@QAE@PAVQWidget@@@Z)
1>arthurwidgets.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall QGLWidget::~QGLWidget(void)" (__imp_??1QGLWidget@@UAE@XZ) referenced in function __unwindfunclet$??0GLWidget@@QAE@PAVQWidget@@@Z$0
1>arthurwidgets.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QGLWidget::QGLWidget(class QGLFormat const &,class QWidget *,class QGLWidget const *,class QFlags<enum Qt::WindowType>)" (__imp_??0QGLWidget@@QAE@ABVQGLFormat@@PAVQWidget@@PBV0@V?$QFlags@W4WindowType@Qt@@@@@Z) referenced in function "public: __thiscall GLWidget::GLWidget(class QWidget *)" (??0GLWidget@@QAE@PAVQWidget@@@Z)
1>arthurwidgets.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QGLFormat::QGLFormat(class QFlags<enum QGL::FormatOption>,int)" (__imp_??0QGLFormat@@QAE@V?$QFlags@W4FormatOption@QGL@@@@H@Z) referenced in function "public: __thiscall GLWidget::GLWidget(class QWidget *)" (??0GLWidget@@QAE@PAVQWidget@@@Z)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall QGLWidget::metaObject(void)const " (?metaObject@QGLWidget@@UBEPBUQMetaObject@@XZ)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall QGLWidget::qt_metacast(char const *)" (?qt_metacast@QGLWidget@@UAEPAXPBD@Z)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall QGLWidget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@QGLWidget@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "protected: virtual bool __thiscall QGLWidget::event(class QEvent *)" (?event@QGLWidget@@MAE_NPAVQEvent@@@Z)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::resizeEvent(class QResizeEvent *)" (?resizeEvent@QGLWidget@@MAEXPAVQResizeEvent@@@Z)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall QGLWidget::updateGL(void)" (?updateGL@QGLWidget@@UAEXXZ)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall QGLWidget::updateOverlayGL(void)" (?updateOverlayGL@QGLWidget@@UAEXXZ)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::initializeGL(void)" (?initializeGL@QGLWidget@@MAEXXZ)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::resizeGL(int,int)" (?resizeGL@QGLWidget@@MAEXHH@Z)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::paintGL(void)" (?paintGL@QGLWidget@@MAEXXZ)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::initializeOverlayGL(void)" (?initializeOverlayGL@QGLWidget@@MAEXXZ)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::resizeOverlayGL(int,int)" (?resizeOverlayGL@QGLWidget@@MAEXHH@Z)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::paintOverlayGL(void)" (?paintOverlayGL@QGLWidget@@MAEXXZ)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::glInit(void)" (?glInit@QGLWidget@@MAEXXZ)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::glDraw(void)" (?glDraw@QGLWidget@@MAEXXZ)
1>arthurwidgets.obj : error LNK2001: unresolved external symbol "public: virtual class QPaintEngine * __thiscall QGLWidget::paintEngine(void)const " (?paintEngine@QGLWidget@@UBEPAVQPaintEngine@@XZ)
1>arthurwidgets.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) protected: void __thiscall QGLWidget::setAutoBufferSwap(bool)" (__imp_?setAutoBufferSwap@QGLWidget@@IAEX_N@Z) referenced in function "public: void __thiscall GLWidget::disableAutoBufferSwap(void)" (?disableAutoBufferSwap@GLWidget@@QAEXXZ)
1>arthurwidgets.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall QGLWidget::swapBuffers(void)" (__imp_?swapBuffers@QGLWidget@@QAEXXZ) referenced in function "protected: virtual void __thiscall ArthurFrame::paintEvent(class QPaintEvent *)" (?paintEvent@ArthurFrame@@MAEXPAVQPaintEvent@@@Z)
1>hoverpoints.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: void __thiscall QGLWidget::swapBuffers(void)" (__imp_?swapBuffers@QGLWidget@@QAEXXZ)
1>C:\...\Debug\gradientEditor.dll : fatal error LNK1120: 28 unresolved externals

Ich habe hier schon so einen ähnlichen Post gefunden der wie ich auch vermutet habe bestätigt hat dass hier eigentlich der Pfad zur library fehlen könnte. Allerdings habe ich in VS beim Projekt den Pfad zum ../Qt4.5/lib directory angeben.

Gibts hier noch andere Ideen woran das liegen könnte?
Eventuell an der Qt Version? Aber dann sollten doch noch andere Fehler außer für das qglwidget kommen?!

Danke schon mal - lg

Verfasst: 22. Januar 2010 19:36
von Christian81
Wenn man OpenGL benutzt sollte man auch gegen die QtOpenGL-Library linken. Aber für solche Dinge gibt es ja eigentlich qmake und die pro-Files...

Verfasst: 23. Januar 2010 12:35
von sacrif
Also ich verwende cmake, und ich habe die QT_OPENGL_LIBRARY eingebunden. Allerdings habe ich jetzt mal durchgesehen welche anderen libraries nicht gefunden werden.
Dabei sind mir die folgenden aufgefallen:

QT_QT3SUPPORT_LIBRARY_DEBUG-NOTFOUND
QT_QT3SUPPORT_LIBRARY_RELEASE-NOTFOUND

QT_QTDBUS_LIBRARY_DEBUG-NOTFOUND
QT_QTDBUS_LIBRARY_RELEASE-NOTFOUND

QT_QTMOTIF_INCLUDE_DIR-NOTFOUND
QT_QTMOTIF_LIBRARY_DEBUG-NOTFOUND
QT_QTMOTIF_LIBRARY_RELEASE-NOTFOUND

QT_QTNSPLUGIN_INCLUDE_DIR-NOTFOUND
QT_QTNSPLUGIN_LIBRARY_DEBUG-NOTFOUND
QT_QTNSPLUGIN_LIBRARY_RELEASE-NOTFOUND

QT_UIC3_EXECUTABLE-NOTFOUND


Nach einiger Recherche habe ich herausgefunden, dass man die Verwendung einiger dieser Komponenten in einen QT_USE_FILE setzen kann.

Meine Frage ist nun wo finde ich diese QT_USE_FILE und wie setzte ich die Variablen dort?

Ist jetzt zwar nicht mehr eine unmittelbare QT Frage, aber vielleicht kann ist ja auch ein eingesessener cmake user hier unter uns :)

Wäre sehr froh wenn mir da wer einen Tipp geben kann.

(Laut FindQt4.cmake heissts ja:
The variable QT_USE_FILE is set which is the path to a CMake file that can be included
# to compile Qt 4 applications and libraries. It sets up the compilation
# environment for include directories, preprocessor defines and populates a
# QT_LIBRARIES variable.
.
.
.
# When using the components argument, QT_USE_QT* variables are automatically set
# for the QT_USE_FILE to pick up. If one wishes to manually set them, the
# available ones to set include:
# QT_USE_QTMOTIF
# QT_USE_QTDBUS
.... und viele mehr )

Verfasst: 23. Januar 2010 13:29
von Christian81
Es ist QT_QTOPENGL_LIBRARY, nicht QT_OPENGL_LIBRARY. siehe auch FindQt4.cmake

Verfasst: 23. Januar 2010 15:33
von sacrif
Das war ein Tippfehler meinerseits hier im forum - weil nicht kopiert - steht im cmake aber richtig. Leider habe ich sonst noch keine lösung gefunden.

Verfasst: 23. Januar 2010 16:08
von Christian81
Wird nun gegen die QtOpenGL.lib gelinkt oder nicht? Wenn es so in der CMakelists.txt steht dann geht es auch. Zeige mal die CMakeLists.txt bzw. ein Testcase...

Verfasst: 23. Januar 2010 17:31
von sacrif
Meines erachtens ja.
im CMakeLists.txt stehen folgende Zeilen:

find_package(Qt4 REQUIRED)

set(QT_USE_OPENGL TRUE)
set(QT_USE_QTXML TRUE)
include(${QT_USE_FILE})
.
.
.
target_link_libraries(gradientEditor ${QT_LIBRARIES} ${QT_QTXML_LIBRARY})

und wenn ich dann nach dem ersten "configure" drücken im cmake auf "show advanced values" gehe wird unter
QT_QTOPENGL_LIBRARY
QT_QTOPENGL_LIBRARY_DEBUG
QT_QTOPENGL_LIBRARY_RELEASE

jeweils der Pfad angegeben.
also genauer stehen die folgenden angabendabei bei den Variable( wobei "..." für den restlichen Pfad steht:
"optimized;C:/.../QT4_5/lib/QtOpenGL4.lib;debug;C:/.../QT4_5/lib/QtOpenGLd4.lib"
"C:/.../QT4_5/lib/QtOpenGLd4.lib"
"C:/.../QT4_5/lib/QtOpenGL4.lib"

Demnach sollte soweit ich das verstehe die library mit gelinkt werden! Kann mein Fehler auch am Fehlen einer anderen oben genannten libraries/executeables/includes liegen?

Verfasst: 23. Januar 2010 17:35
von Christian81
Warum benutzt Du einerseits ${QT_LIBRARIES} und dann andererseits direkt ${QT_QTXML_LIBRARY} ?
Und auch bei QtUseFile heißt es QT_USE_QTOPENGL ...