Seite 1 von 1

[gelöst] Qt 4.1.4 unter VS2005-express Compiler Fehler

Verfasst: 13. April 2007 19:51
von der_andreas
Hallo,
jetzt wollte ich auch mal meine KDE-Mini-Progrämmchen unter Win32 compilieren. Dazu habe ich MS Visual Studio 2005 Express auf XP SP2 installiert.
Das PSDK, Qt-4.1.4-win-opensource, acs4qt414 , VS-SP1 sowie der Patch (VS80sp1-KB930198-X86-DEU von http://hotfix.xable.net/) ist eingepflegt.
Den Thread mit Shadows hervorragender Zusammenfassung (http://www.qtforum.de/forum/viewtopic.php?t=1259) habe ich penibelst befolgt, alle Pfade überall eingetragen und kriege jetzt auch keine Linker- oder Typfehler mehr in den Qt-Libs. Vielmehr scheint VS seine eigenen Libs nicht mehr richtig zu kennen. Die Anwendung ist ein einfachster Dialog (Source unter http://andy.krumnow.de/devel/cpp/seiten ... /index.php ). Unter Linux/KDevelop wird das schön gebaut, aber VSe meckert beim (neu) erstellen des projekts folgendermaßen rum (vielleicht kommts ja jemandem bekannt vor ...):

Code: Alles auswählen

1>------ Erstellen gestartet: Projekt: seitenspiegel, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>cl : Command line warning D9007 : '/Gm' requires '/Zi'; option ignored
1>cl : Command line warning D9002 : ignoring unknown option '/ZI'
1>seitenspiegel.cpp
1>C:\MS-VisualStudio_8\VC\include\string.h(142) : warning C4616: #pragma warning : warning number '6059' out of range, must be between '4001' and '4999'
[ usw. .... pragma warnings ..... ]

1>C:\MS-VisualStudio_8\VC\include\xutility(911) : error C2275: 'std::_Iterator_base' : illegal use of this type as an expression
1>        C:\MS-VisualStudio_8\VC\include\xutility(117) : see declaration of 'std::_Iterator_base'
1>        C:\MS-VisualStudio_8\VC\include\xutility(912) : see reference to class template instantiation 'std::_Checked_iterator_category<_Iter>' being compiled
1>C:\MS-VisualStudio_8\VC\include\xutility(911) : error C3861: '__is_base_of': identifier not found
1>C:\MS-VisualStudio_8\VC\include\xutility(957) : error C2275: 'std::_Iterator_base' : illegal use of this type as an expression
1>        C:\MS-VisualStudio_8\VC\include\xutility(117) : see declaration of 'std::_Iterator_base'
1>        C:\MS-VisualStudio_8\VC\include\xutility(962) : see reference to class template instantiation 'std::_Checked_iterator_base_helper<_Iter>' being compiled
1>C:\MS-VisualStudio_8\VC\include\xutility(957) : error C3861: '__is_base_of': identifier not found
[ ... pragma warnings ... ]

1>C:\MS-VisualStudio_8\VC\include\ostream(646) : fatal error C1903: unable to recover from previous error(s); stopping compilation
1>moc_seitenspiegel.cpp
[ ... pragma warnings ... ]

1>C:\MS-VisualStudio_8\VC\include\xutility(911) : error C2275: 'std::_Iterator_base' : illegal use of this type as an expression
1>        C:\MS-VisualStudio_8\VC\include\xutility(117) : see declaration of 'std::_Iterator_base'
1>        C:\MS-VisualStudio_8\VC\include\xutility(912) : see reference to class template instantiation 'std::_Checked_iterator_category<_Iter>' being compiled
1>C:\MS-VisualStudio_8\VC\include\xutility(911) : error C3861: '__is_base_of': identifier not found
1>C:\MS-VisualStudio_8\VC\include\xutility(957) : error C2275: 'std::_Iterator_base' : illegal use of this type as an expression
1>        C:\MS-VisualStudio_8\VC\include\xutility(117) : see declaration of 'std::_Iterator_base'
1>        C:\MS-VisualStudio_8\VC\include\xutility(962) : see reference to class template instantiation 'std::_Checked_iterator_base_helper<_Iter>' being compiled
1>C:\MS-VisualStudio_8\VC\include\xutility(957) : error C3861: '__is_base_of': identifier not found
[ ... pragma warnings ... ]

1>C:\MS-VisualStudio_8\VC\include\ostream(646) : fatal error C1903: unable to recover from previous error(s); stopping compilation
1>main.cpp
[ ... pragma warnings ... ]

1>C:\MS-VisualStudio_8\VC\include\xutility(911) : error C2275: 'std::_Iterator_base' : illegal use of this type as an expression
1>        C:\MS-VisualStudio_8\VC\include\xutility(117) : see declaration of 'std::_Iterator_base'
1>        C:\MS-VisualStudio_8\VC\include\xutility(912) : see reference to class template instantiation 'std::_Checked_iterator_category<_Iter>' being compiled
1>C:\MS-VisualStudio_8\VC\include\xutility(911) : error C3861: '__is_base_of': identifier not found
1>C:\MS-VisualStudio_8\VC\include\xutility(957) : error C2275: 'std::_Iterator_base' : illegal use of this type as an expression
1>        C:\MS-VisualStudio_8\VC\include\xutility(117) : see declaration of 'std::_Iterator_base'
1>        C:\MS-VisualStudio_8\VC\include\xutility(962) : see reference to class template instantiation 'std::_Checked_iterator_base_helper<_Iter>' being compiled
1>C:\MS-VisualStudio_8\VC\include\xutility(957) : error C3861: '__is_base_of': identifier not found
1>C:\MS-VisualStudio_8\VC\include\xutility(1615) : warning C4616: #pragma warning : warning number '6295' out of range, must be between '4001' and '4999'
1>C:\MS-VisualStudio_8\VC\include\xlocale(639) : warning C4616: #pragma warning : warning number '6011' out of range, must be between '4001' and '4999'
1>C:\MS-VisualStudio_8\VC\include\ostream(646) : fatal error C1903: unable to recover from previous error(s); stopping compilation
1>Generating Code...
1>Das Buildprotokoll wurde unter "file://c:\prog\pj\seitenspiegel\debug\BuildLog.htm" gespeichert.
1>seitenspiegel - 15 Fehler, 26 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 bersprungen ==========
Hat jemand ne Idee zur Beseitigung dieser Fehler ?
Müssen die Pfade in einer bestimmten Reihenfolge eingetragen werden?
Bitte entschuldigt den länglichen Text. Das Problem kostet mich jetzt schon zwei Abende :(
Danke fürs lesen und drüber nachdenken
Andreas

PS. und natürlich hab ich schon das halbe netz durchsucht, aber den entscheidenden Hinweis nicht gefunden. Auch hier nicht. Bin dankbar für jeden Hinweis.

Verfasst: 14. April 2007 17:58
von der_andreas
Hallo Gemeinde,
habe VC und PSDK deinstalliert sowie QT-4.1.4 entfernt. Dann alles nochmal von vorne, diesmal mit Qt-4.2.3. Die Anleitung von Shadow (nachgebessert was die Reihenfolge betrifft) angewandt, den qconfigure.bat Lauf mit -static und nmake mit sub-src gestartet, und kriege jetzt wieder Linkerfehler.
Hier nochmal die besagte Anleitung:
1. Visual Studio 2005 Express downloaden und installieren, falls noch nicht vorhanden.

2. Platform SDK von Microsoft downloaden und installieren.

3. QT-WIN 4.1.1 OpenSource und Patch für V4.1.1 für Visual Studio 2005 downloaden. Dieser Patch funktioniert auch mit der Qt-Version 4.1.2.

4. QT 4.1.1 entpacken, anschließend den Patch entpacken und ins QT-Verzeichnis kopieren, z.B. in C:\Qt\4.1.1.

5. Im Platform-SDK Verzeichnis die Datei"setenv.cmd" ausführen, um entsprechende INCLUDE-Umgebungsvariablen zu setzen. Die Konsole ruft im Unterverzeichnis SDK\V2.0\BIN die Batchdatei sdkvars.bat auf. Diese Datei enthält den Inhalt der zu setzenden Pfadangaben.

6. Visual Studio 8-Konsole öffnen, dort im QT-Verzeichnis "installpatch41.bat" ausführen, danach den Befehl "qconfigure.bat msvc2005" ausführen ( evtl. mit angehängtem '-static' für den statischen build), lizenz abnicken, ein paar mal mit 'y' bestätigen. Anschließend mit 'nmake' ( mit angehängtem ' sub-src' bei vorheriger Wahl von '-static') den Build starten. Zeit Wäsche zu waschen, Essen zu kochen und Staubzusaugen.

7. Jetzt die Qt-Umgebungsvariablen richtig setzen, wie z.B:
@set QMAKESPEC=win32-msvc2005
@set PATH=C:\Qt\4.1.1\bin;%PATH%
@set QTDIR=C:\Qt\4.1.1

8. Alle wichtigen Pfade aus Punkt 6 sind ebenfalls auch als INCLUDE und LIB-Pfade im VC 2005 Express unter "Extras -> Optionen" hinzuzufügen.

9. Existiert im Projektverzeichnis bislang noch keine PRO-Datei, diese folgendermaßen erzeugen:
qmake -project -o Project.pro "QT=core gui opengl" "TARGET=Project". Hierbei werden alle im Verzeichnis befindlichen und relevanten Dateien eingebunden.
Der Abschnitt "gui opengl" dient als Beispiel und ist optional, da hier lediglich projektbezogen noch entsprechende Libs eingetragen werden können, gegen welche später automatisch gelinkt werden.

10. Jetzt das gewünschte Projekt unter einer Visual Studio 8 konformen Konsole erstellen mit: qmake -tp vc -o [Projektname]. Unter dieser Konsole müssen alle relevanten Pfade zur SDK als auch die QT-Pfade wie o.a. gesetzt sein. Ich empfehle daher für die Entwicklung diese ganzen Pfade den festen Systemumgebungsvariablen hinzuzufügen bzw. zu speichern. ([WinXP]: Systemsteuerung >> System >> Erweitert >> "Starten und Wiederherstellen" >> Einstellungen).

11. Für eine regelmäßige Aktualisierung des Qt-Projektes sollte eine kleine Batch-Datei im Projektverzeichnis angelegt werden, die die Befehle von Punkt 9 und 10 nacheinander enthält. Bei Ausführung aktualisiert diese automatisch das ganze Projekt im Verzeichnis, inklusive neuer Ressourcen, u.s.w. Die Variante erspart zudem, dass umständliche Einstellungen für neu hinzugekommene Projektdateien im VC Express vorgenommen werden müssen.
Die Fehler die jetzt kriege sehen so aus:
MOC src\seitenspiegel.h
Kompilieren...
main.cpp
seitenspiegel.cpp
moc_seitenspiegel.cpp
Code wird generiert...
Verknüpfen...
QtGuid.lib(qaccessible_win.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__PlaySoundA@12" in Funktion ""public: static void __cdecl QAccessible::updateAccessibility(class QObject *,int,enum QAccessible::Event)" (?updateAccessibility@QAccessible@@SAXPAVQObject@@HW4Event@1@@Z)".
QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ImmSetCandidateWindow@8" in Funktion ""public: virtual void __thiscall QWinInputContext::update(void)" (?update@QWinInputContext@@UAEXXZ)".
QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ImmSetCompositionWindow@8" in Funktion ""public: virtual void __thiscall QWinInputContext::update(void)" (?update@QWinInputContext@@UAEXXZ)".
QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ImmSetCompositionFontA@8" in Funktion ""public: virtual void __thiscall QWinInputContext::update(void)" (?update@QWinInputContext@@UAEXXZ)".
QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ImmSetCompositionFontW@8" in Funktion ""public: virtual void __thiscall QWinInputContext::update(void)" (?update@QWinInputContext@@UAEXXZ)".
QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ImmGetContext@4" in Funktion ""struct HIMC__ * __cdecl getContext(struct HWND__ *)" (?getContext@@YAPAUHIMC__@@PAUHWND__@@@Z)".
QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ImmReleaseContext@8" in Funktion ""void __cdecl releaseContext(struct HWND__ *,struct HIMC__ *)" (?releaseContext@@YAXPAUHWND__@@PAUHIMC__@@@Z)".
QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ImmNotifyIME@16" in Funktion ""void __cdecl notifyIME(struct HIMC__ *,unsigned long,unsigned long,unsigned long)" (?notifyIME@@YAXPAUHIMC__@@KKK@Z)".
QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ImmGetCompositionStringA@16" in Funktion ""long __cdecl getCompositionString(struct HIMC__ *,unsigned long,void *,unsigned long,bool *)" (?getCompositionString@@YAJPAUHIMC__@@KPAXKPA_N@Z)".
QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ImmGetCompositionStringW@16" in Funktion ""long __cdecl getCompositionString(struct HIMC__ *,unsigned long,void *,unsigned long,bool *)" (?getCompositionString@@YAJPAUHIMC__@@KPAXKPA_N@Z)".
QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ImmAssociateContext@8" in Funktion ""public: static void __cdecl QWinInputContext::enable(class QWidget *,bool)" (?enable@QWinInputContext@@SAXPAVQWidget@@_N@Z)".
QtGuid.lib(qwininputcontext_win.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ImmGetDefaultIMEWnd@4" in Funktion ""struct HWND__ * __cdecl getDefaultIMEWnd(struct HWND__ *)" (?getDefaultIMEWnd@@YAPAUHWND__@@PAU1@@Z)".
QtCored.lib(qeventdispatcher_win.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_WSAAsyncSelect@16" in Funktion ""public: virtual void __thiscall QEventDispatcherWin32::registerSocketNotifier(class QSocketNotifier *)" (?registerSocketNotifier@QEventDispatcherWin32@@UAEXPAVQSocketNotifier@@@Z)".
debug\seitenspiegel.exe : fatal error LNK1120: 13 nicht aufgelöste externe Verweise.
Warum ?
Danke für Eure Aufmerksamkeit

Verfasst: 14. April 2007 19:05
von Christian81
Winmm.lib in mkspecs\win32-msvc2005\qmake.conf hinzufügen (Zeile QMAKE_LIBS_GUI), gmake in src\gui aufrufen und neu kompilieren lassen.
Wenns geht muss ich den Patch korrigieren.

Verfasst: 14. April 2007 23:04
von der_andreas
erstmal danke für die Antwort.
Leider tritt immer noch der selbe Fehler auf.
Unabhängig davon, daß winmm.lib schon in qmake.conf eingetragen war, habe ich es nochmal mit großem 'W' am Ende der Zeile hinzugefügt (aus esoterischen Gründen) und den kompletten Qt-Kram neu aufgesetzt. Also QT-Dir gelöscht, zip neu entpackt, Patch rein, 'installpatch' gemacht, 'qconfigure.bat msvc2005 -static' abgeschickt, dreimal genickt, 'nmake sub-src' lief dann auch durch. Aber leider läuft 'Projektmappe neu erstellen' nicht durch.

PS. hast Du den qtwin-patch entwickelt? Respekt!

Verfasst: 14. April 2007 23:11
von Christian81
Mist, habe mich verschaut.
Irgendwie scheint es da ein kleines qmake - Problem zu geben (cmake ist da intelligenter ;) )
Du musst natürlich die libs in deiner pro-Datei vom seitenspiegel - Projekt hinzufügen -->
LIBS += Imm32.lib Winmm.lib ws2_32.lib
(und ggf. noch mehr wenn ein paar symbole fehlen -> einfach auf msdn.microsoft.com suchen - dort steht in welcher lib welches Symbol zu finden ist)
Eigentlich dachte ich dass Qt dies von sich aus macht - zumindest scheint es ja keine Probleme beim Linken der Qt-Proggies zu geben und bei mir funktioniert es ja auch...

Verfasst: 14. April 2007 23:27
von der_andreas
Wow, das war ja ne Express-Antwort,
ja dann, werd ich das gleich mal probieren. Danke. Muß halt immer neu booten, weil ich mit Windows nicht ins Netz gehe (NIC deaktiviert). Da bin ich paranoid :)
So, jetzt bin ich mal gespannt.....

Verfasst: 15. April 2007 00:19
von der_andreas
Ohh jaa, ja, ja, jaahh ! Es funzt. Mein Dank wird Dir ewig nachschleichen.
(immer noch orgiastische Laute ausstoßend...)

Das hier:
Du musst natürlich die libs in deiner pro-Datei vom seitenspiegel - Projekt hinzufügen -->
LIBS += Imm32.lib Winmm.lib ws2_32.lib
war der entscheidende Punkt.

Für die weitere (Win-)Entwicklung eine wertvolle Hilfe:
(und ggf. noch mehr wenn ein paar symbole fehlen -> einfach auf msdn.microsoft.com suchen - dort steht in welcher lib welches Symbol zu finden ist)
Eigentlich dachte ich dass Qt dies von sich aus macht
deswegen war ich ja auch so verdattert. _Damit_ habe ich nicht gerechnet. Evtl. ist das ja bei der kommerziellen Version besser. Aber was ich da schon für Threads gelesen habe...
- zumindest scheint es ja keine Probleme beim Linken der Qt-Proggies zu geben
ich gebe zu, keines der QT-Beispiele unter Windows kompiliert zu haben. Noch nicht mal versucht habe ich das. Aber das Programm mit dem ich es versucht habe, ist vom Umfang, der Qualität und der Schöpfungshöhe, auf demselben Niveau, wie eines der einfacheren 'QT-Widget-Examples'. Nichtsdestotrotz freue ich mich riesig, daß dieses ärgerliche Problem, dank Deiner Hilfestellung, für mich handhabbar wird. (Muss ich mir noch ein paar Gedanken drum machen)
und bei mir funktioniert es ja auch...
und bei mir jetzt auch. Dieses Forum hat sehr wertvolle Beiträge zu bieten. Vielen Dank an die Gemeinde.

:D