C++ mit Qt und OpenGL @ Visual Studio 2005 - Linker Problem



  • Hallo erstmal!

    Seit kurzem verwende ich Qt, damit meine Programme auch unter Linux bzw. Mac OS laufen, deshalb verwende ich auch OpenGL. Qt läuft nun schon halbwegs, ich hab's geschafft dass es mit Visual Studio zusammenarbeitet. (Die Open Source Version) Ein kleines Beispielprogramm das ein Dialogfenster erstellt läuft zum Beispiel.
    Mein einziges Problem ist jetzt nur noch, dass ich die Beispiele von Qt für Open GL nicht kompilieren kann, und damit dann natürlich auch meine eigenen Programme nicht.

    1>------ Build started: Project: OpenGLmitqt, Configuration: Debug Win32 ------
    1>Linking...
    1>glwidget.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall QGLWidget::~QGLWidget(void)" (__imp_??1QGLWidget@@UAE@XZ) referenced in function "public: virtual __thiscall GLWidget::~GLWidget(void)" (??1GLWidget@@UAE@XZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QGLWidget::QGLWidget(class QWidget *,class QGLWidget const *,class QFlags<enum Qt::WindowType>)" (__imp_??0QGLWidget@@QAE@PAVQWidget@@PBV0@V?$QFlags@W4WindowType@Qt@@@@@Z) referenced in function "public: __thiscall GLWidget::GLWidget(class QWidget *)" (??0GLWidget@@QAE@PAVQWidget@@@Z)
    1>glwidget.obj : error LNK2001: unresolved external symbol "protected: virtual bool __thiscall QGLWidget::event(class QEvent *)" (?event@QGLWidget@@MAE_NPAVQEvent@@@Z)
    1>glwidget.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::paintEvent(class QPaintEvent *)" (?paintEvent@QGLWidget@@MAEXPAVQPaintEvent@@@Z)
    1>glwidget.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::resizeEvent(class QResizeEvent *)" (?resizeEvent@QGLWidget@@MAEXPAVQResizeEvent@@@Z)
    1>glwidget.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall QGLWidget::updateGL(void)" (?updateGL@QGLWidget@@UAEXXZ)
    1>glwidget.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall QGLWidget::updateOverlayGL(void)" (?updateOverlayGL@QGLWidget@@UAEXXZ)
    1>glwidget.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::initializeOverlayGL(void)" (?initializeOverlayGL@QGLWidget@@MAEXXZ)
    1>glwidget.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::resizeOverlayGL(int,int)" (?resizeOverlayGL@QGLWidget@@MAEXHH@Z)
    1>glwidget.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::paintOverlayGL(void)" (?paintOverlayGL@QGLWidget@@MAEXXZ)
    1>glwidget.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::glInit(void)" (?glInit@QGLWidget@@MAEXXZ)
    1>glwidget.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall QGLWidget::glDraw(void)" (?glDraw@QGLWidget@@MAEXXZ)
    1>glwidget.obj : error LNK2001: unresolved external symbol "public: virtual class QPaintEngine * __thiscall QGLWidget::paintEngine(void)const " (?paintEngine@QGLWidget@@UBEPAVQPaintEngine@@XZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glDeleteLists@8 referenced in function "public: virtual __thiscall GLWidget::~GLWidget(void)" (??1GLWidget@@UAE@XZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall QGLWidget::makeCurrent(void)" (__imp_?makeCurrent@QGLWidget@@QAEXXZ) referenced in function "public: virtual __thiscall GLWidget::~GLWidget(void)" (??1GLWidget@@UAE@XZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glEnable@4 referenced in function "protected: virtual void __thiscall GLWidget::initializeGL(void)" (?initializeGL@GLWidget@@MAEXXZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glShadeModel@4 referenced in function "protected: virtual void __thiscall GLWidget::initializeGL(void)" (?initializeGL@GLWidget@@MAEXXZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall QGLWidget::qglClearColor(class QColor const &)const " (__imp_?qglClearColor@QGLWidget@@QBEXABVQColor@@@Z) referenced in function "protected: virtual void __thiscall GLWidget::initializeGL(void)" (?initializeGL@GLWidget@@MAEXXZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glCallList@4 referenced in function "protected: virtual void __thiscall GLWidget::paintGL(void)" (?paintGL@GLWidget@@MAEXXZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glRotated@32 referenced in function "protected: virtual void __thiscall GLWidget::paintGL(void)" (?paintGL@GLWidget@@MAEXXZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glTranslated@24 referenced in function "protected: virtual void __thiscall GLWidget::paintGL(void)" (?paintGL@GLWidget@@MAEXXZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glLoadIdentity@0 referenced in function "protected: virtual void __thiscall GLWidget::paintGL(void)" (?paintGL@GLWidget@@MAEXXZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glClear@4 referenced in function "protected: virtual void __thiscall GLWidget::paintGL(void)" (?paintGL@GLWidget@@MAEXXZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glOrtho@48 referenced in function "protected: virtual void __thiscall GLWidget::resizeGL(int,int)" (?resizeGL@GLWidget@@MAEXHH@Z)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glMatrixMode@4 referenced in function "protected: virtual void __thiscall GLWidget::resizeGL(int,int)" (?resizeGL@GLWidget@@MAEXHH@Z)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glViewport@16 referenced in function "protected: virtual void __thiscall GLWidget::resizeGL(int,int)" (?resizeGL@GLWidget@@MAEXHH@Z)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glEndList@0 referenced in function "private: unsigned int __thiscall GLWidget::makeObject(void)" (?makeObject@GLWidget@@AAEIXZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glEnd@0 referenced in function "private: unsigned int __thiscall GLWidget::makeObject(void)" (?makeObject@GLWidget@@AAEIXZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glBegin@4 referenced in function "private: unsigned int __thiscall GLWidget::makeObject(void)" (?makeObject@GLWidget@@AAEIXZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glNewList@8 referenced in function "private: unsigned int __thiscall GLWidget::makeObject(void)" (?makeObject@GLWidget@@AAEIXZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glGenLists@4 referenced in function "private: unsigned int __thiscall GLWidget::makeObject(void)" (?makeObject@GLWidget@@AAEIXZ)
    1>glwidget.obj : error LNK2019: unresolved external symbol __imp__glVertex3d@24 referenced in function "private: void __thiscall GLWidget::quad(double,double,double,double,double,double,double,double)" (?quad@GLWidget@@AAEXNNNNNNNN@Z)
    1>glwidget.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall QGLWidget::qglColor(class QColor const &)const " (__imp_?qglColor@QGLWidget@@QBEXABVQColor@@@Z) referenced in function "private: void __thiscall GLWidget::quad(double,double,double,double,double,double,double,double)" (?quad@GLWidget@@AAEXNNNNNNNN@Z)
    1>moc_glwidget.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual void * __thiscall QGLWidget::qt_metacast(char const *)" (__imp_?qt_metacast@QGLWidget@@UAEPAXPBD@Z) referenced in function "public: virtual void * __thiscall GLWidget::qt_metacast(char const *)" (?qt_metacast@GLWidget@@UAEPAXPBD@Z)
    1>moc_glwidget.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual int __thiscall QGLWidget::qt_metacall(enum QMetaObject::Call,int,void * *)" (__imp_?qt_metacall@QGLWidget@@UAEHW4Call@QMetaObject@@HPAPAX@Z) referenced in function "public: virtual int __thiscall GLWidget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@GLWidget@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
    1>moc_glwidget.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: static struct QMetaObject const QGLWidget::staticMetaObject" (__imp_?staticMetaObject@QGLWidget@@2UQMetaObject@@B)
    1>debug\OpenGLmitqt.exe : fatal error LNK1120: 36 unresolved externals
    1>Build log was saved at "file://x:\Daten\EigeneProgramme\Open GL\OpenGLmitqt\debug\BuildLog.htm"
    1>OpenGLmitqt - 37 error(s), 0 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

    Die include Verzeichnisse sind alle korrekt eingebunden, was ich falsch gemacht habe weiß ich nicht.
    Auch die Suche mit Google und auf der Qt-Website haben keine Erfolge gezeigt, ich weiß echt nicht mehr weiter.
    Hat irgendjemand eine Idee was das sein könnte? 😞
    Schon mal Danke im Voraus!

    mfg, bloodycross

    PS: Nur so am Rande: Ich hab' auch ein kleines Problem mit dem einbinden des Manifests in die .exe, da bricht er jedesmal mit einem Fehler ab:

    1>------ Rebuild All started: Project: ggT, Configuration: Release Win32 ------
    1>Deleting intermediate and output files for project 'ggT', configuration 'Release|Win32'
    1>Compiling...
    1>ggT.cpp
    1>Linking...
    1>Embedding manifest...
    1>Project : error PRJ0002 : Error result 1 returned from 'C:\WINDOWS\system32\cmd.exe'.
    1>Build log was saved at "file://x:\Daten\EigeneProgramme\ggT\Release\BuildLog.htm"
    1>ggT - 1 error(s), 0 warning(s)
    ========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

    Die .exe läuft glücklicherweise trotzdem, wozu ist das Manifest eigentlich gut?



  • QtOpenGLd4.lib / QtOpenGL4.lib mitgelinked?



  • Naja, ich habe das lib-Verzeichnis von Qt in Visual Studio eingetragen, reicht das? (Tools / Options / Projects and Solutions / VC++ Directories -> bei Library files eingetragen)

    mfg, bloodycross



  • Du musst alle benötigten Qt-Bibliotheken mitlinken.
    Alt + F7 > Konfigurationseigenschaften / Preferences(?) > Linker > Eingabe / Input > Zusätzliche Abhängigkeiten / Additional Dependencies. Was genau du jetzt alles benötigst weiß ich leider nicht mehr.

    Deine (wahrscheinlich) benötigten Bibliotheken sind:

    QtOpenGLd4.lib
    qtcored4.lib
    qtguid4.lib
    

    Für die Release-Version einfach das d vor der 4 weglassen. Falls noch mehr fehlt -> im Qt Ordner nachschauen, welche Libs es alle gibt und evtl. noch mehr dazu linken. Einfach ausprobieren. Zumindest mache ich das immer so 🙂

    Bzw. gehört das nicht in dieses Forum AFAIK.



  • Juhu, es funktioniert! Naja, fast, es sind nur mehr 17 unresolved externals, ich werde einfach mal alle .libs durchprobieren.
    Vielen Dank für deine Hilfe! 👍

    Gehört mein Problem nicht hier rein? Es hat ja nur was mit Visual C++ zu tun, deshalb hab' ich es hier rein getan.

    mfg, bloodycross

    Edit: Ich habe jetzt alle .libs eingebunden, trotzdem habe ich noch 17 "unresolved external symbol" Fehler. Soll ich vielleicht statt den .libs die .dlls einbinden?



  • Dlls kannst du nicht einbinden 😛
    AFAIK musst du aber deinem Programm (wenn es denn fertig ist) die entsprechenden Qt-Bibliothek in der OOS-Variante beilegen, da das Zeug dynamisch geladen wird.

    Kurz: Ich kann dir da leider auch nicht helfen.
    Frag sonst einfach mal im deutschen Qt-Forum nach.

    PS.: Der Thread gehört m. M. nach in das "Andere GUIs"-Forum, weil es eigentlich kein Problem mit VSC++ ist.



  • Dieser Thread wurde von Moderator/in Marc++us aus dem Forum MFC (Visual C++) in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • @john durian: Danke für deinen Tipp mit dem Qt Forum!
    Im Wiki habe ich die Lösung gefunden. (http://qtnode.net/wiki/Qt4_with_Visual_Studio)

    Ich musste einfach in der .pro Datei "QT+= opengl" hinzufügen, das war alles. Ich muss nur herausfinden was ich bei anderen Projekten machen muss, aber das steht erst mal im Hintergrund.

    Nochmal vielen Dank an alle die mir geholfen haben! 👍

    mfg, bloodycross


Log in to reply