Qt 4.6 mit VS 2008 Express: Linkerfehler beim builden
-
Hallo,
Ich möchte QT 4.6 mit VS 2008 Express benutzen.
Dazu hab ich folgendes Qt runergeladen und installiert:
Qt libraries 4.6 for Windows (VS 2008, 190 MB, http://qt.nokia.com/downloads/windows-cpp-vs2008)
Danach habe ich eine VS2008 Prompt aufgemacht und darin:
configure -platform win32-msvc2008
=>OK
nmake
=>gibt folgenden Linker-Fehler:
Generating Code...
link /NOLOGO /INCREMENTAL:NO /SUBSYSTEM:CONSOLE /MANIFEST /MANIFESTFILE:
"release\moc.intermediate.manifest" /OUT:..\..\..\bin\moc.exe @C:\DOCUME1\Max\LOCALS1\Temp\nm92.tmp
bootstrap.lib(qbytearray.obj) : error LNK2019: unresolved external symbol _uncompress referenced in function "class QByteArray __cdecl qUncompress(unsigned char const *,int)" (?qUncompress@@YA?AVQByteArray@@PBEH@Z)
bootstrap.lib(qbytearray.obj) : error LNK2019: unresolved external symbol _compress2 referenced in function "class QByteArray __cdecl qCompress(unsigned char const *,int,int)" (?qCompress@@YA?AVQByteArray@@PBEHH@Z)
..\..\..\bin\moc.exe : fatal error LNK1120: 2 unresolved externalsHat jemand eine Idee woran's hängt?
Die Funktionen scheinen zu zlib zu gehötren.
Muss ich zlib separat installieren? Welche Version und von wo? Wie muss ich das dann einbinden?
Jegliche Hilfe wilkommen.
Scrontch.PS: Ich habe das auch schon mit dem QT-4.6 SDK ausprobiert. Selber Fehler.
-
^^
Schau mal einen Beitrag über diesem.Weiss nicht, aber vielleicht hilft dir die dortig genannte Lösung auch etwas.
(Bin selbst wieder am builden sieht also gut aus..)
-
Ja, habe deine Beitrag gesehen. (wollte den aber nicht schmarotzen).
Welche Lösung meinst du?
Die mit dem mocinclude.tmp löschen?
Die Dateien kann ich bei mir nicht finden.
-
Nicht?
Dann würde ich das SDK mal nochmal laden. (Hast du auch sicher die richtige Version für Windows?)Ansonsten gibts Binarys hier:
http://qt.nokia.com/downloads/windows-cpp-vs2008
-
Ok, ich geb also das selber builden erstmal auf und nehme die fertigen Binaries.
Ich habe es auch jetzt mal geschaft ein Besipielprogramm (calculator) zu kompilieren.
Aber linken will er nicht.
Das Qt "lib" Verzeichnis hab ich als "Additional Library Directory" im Projekt angegeben, aber das scheint nicht genug zu sein.
Weiss jemand weiter?
-
Was hast du für einen Linkerfehler?
Wenn es der gleiche ist, wie in meinem Beitrag, dann sollte das mit dem löschen der genannten Dateien funktionieren.
-
Also ich bin jetzt soweit:
Ich hab nun ein VS2008 Projekt erstellt, um mal das Beispielprogramm "calculator" zu builden.
Kompilieren tut das auch.
Zum Linken hab ich dann die Qt-Libs per Eigenschaften Linker/Additional dependencies eingebunden.
Trotzdem erscheinen noch folgende unaufgelöste Symbole:1>Linking... 1>button.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Button::metaObject(void)const " (?metaObject@Button@@UBEPBUQMetaObject@@XZ) 1>button.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall Button::qt_metacast(char const *)" (?qt_metacast@Button@@UAEPAXPBD@Z) 1>button.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall Button::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Button@@UAEHW4Call@QMetaObject@@HPAPAX@Z) 1>calculator.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Calculator::metaObject(void)const " (?metaObject@Calculator@@UBEPBUQMetaObject@@XZ) 1>calculator.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall Calculator::qt_metacast(char const *)" (?qt_metacast@Calculator@@UAEPAXPBD@Z) 1>calculator.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall Calculator::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Calculator@@UAEHW4Call@QMetaObject@@HPAPAX@Z) 1>calculator.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const Calculator::staticMetaObject" (?staticMetaObject@Calculator@@2UQMetaObject@@B) 1>calculator.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const Button::staticMetaObject" (?staticMetaObject@Button@@2UQMetaObject@@B) 1>D:\Dev\calculator\Debug\calculator.exe : fatal error LNK1120: 8 unresolved externals
kann jemand helfen?
(PS: danke für dein Interesse, drakon)
Und die mocinclude.tmp gibt es nach wie vor nirgends.
-
Bist du sicher, dass du den richtigen Ordner angegeben hast?
Bei mir sind die gebuildeten libs unter qt/2009.5/qt/lib
Es gibt eben einen anderen Ordner, unter qt/2009.5/lib, welcher keine libs enthält.Vielleicht liegts an dem.
-
Ok, also ich glaub da gab es vielleicht ein Missverständnis.
In meiner Unerfahrenheit mit Qt dachte ich man kann direkt selbst ein VS2008 Projekt von Hand erstellen. Das hat zu den oben beschriebenen Problemen geführt.Nun hab ich aber die Lösung gefunden:
Ich gebe im Beispielverzeichnis in der Kommnadozeile folgendes ein:
set QMAKESPEC=win32-msvc2008
qmake -tp vcDadurch erstellt qmake mir ein VS2008 Porjekt (.vcproj).
Dies kann ich nun ganz einfach öffnen und der Build funktioniert auch prima.
Ich sehe insbesondere, dass da auch noch weitere "temporäre" CPP dateien erstellt wurden (zB. moc_button.cpp). Dieser Build Prozess ist mir noch ein wenig schleierhaft. Die Frage ist insbesondere ob ich nun bei jeder Codeänderung erneut qmake ausführen muss? Oder kann ich von nun an mit dem VS2008 Projekt weitermachen.
Was ist wenn ich neue Qt-Widgets hinzufüge? (mittels des QtDesigners).
-
Also ich habe ein ganz normales Konsolenprojekt gemacht und dann die Librarys, die er verlangt noch von Hand eingetragen.
c:\Programme\Qt\2009.05\qt\lib\qtmaind.lib
c:\Programme\Qt\2009.05\qt\lib\QtScriptd4.lib
c:\Programme\Qt\2009.05\qt\lib\QtScriptToolsd4.lib
c:\Programme\Qt\2009.05\qt\lib\QtXmld4.lib
c:\Programme\Qt\2009.05\qt\lib\QtGuid4.lib
c:\Programme\Qt\2009.05\qt\lib\QtCored4.lib
c:\Programme\Qt\2009.05\qt\lib\QtUiToolsd.libDie habe ich einfach aus einem Example kopiert. (beachte den korrekten Pfad)
Dann klappt der Linker auch. Was aber auch noch ist, ist, dass die Header ebenfalls zusätzliche includes haben, aber bei den examples durch einen relativen Pfad angegeben sind. Ich mache das jetzt einfach so, dass ich den korrekten Pfad vom include Ordner her gesehen angebe. Also include ich nicht, wie die examples einfach QtGui, sondern QtGui/QtGui:
#include <QtGui> #include <QtGui/QtGui> //anstatt das oben
Man könnte natürlich die Pfade auch entsprechend anpassen, dass sie auch wieder in den include Ordner reinzeigen, aber naja.
-
Die includes an sich sind kein Problem, kompilieren tut es ja.
Habe jetzt aber verstanden, dass man die Qt example headers nicht einfach so verwenden darf, sondern zuerst "moc" (http://qt.nokia.com/doc/4.6/moc.html) drüberlaufen lassen muss, welches dann eben diese temporären Dateien erzeugt. Und erst dann geht man damit in VC.
Jetzt gilt es nur noch diesen Schritt irgendwie im VS-Projekt zu automatisieren. (Pre-Build Step?)
Ich probier damit mal ein bisschen rum.
-
Also das mit dem moc musst du nur machen, wenn du selbst eine Klasse schreibst, die signals und slots unterstützen soll. Und da kannst du z.B das VS Plugin benutzen, um so ein Projekt zu machen und dann musst du dich nicht mehr dafrum kümmern.
Download hier:
http://qt.nokia.com/downloads/visual-studio-add-in