MOC nur bei Bedarf einsetzen (MSVS 2010)

Alles zu Entwicklungsumgebungen und Editoren für Qt
Antworten
bobcat
Beiträge: 125
Registriert: 21. April 2010 14:51

MOC nur bei Bedarf einsetzen (MSVS 2010)

Beitrag von bobcat »

Hallo,

ich arbeite mit Qt 4.7.4, erstelle mit qmake aus meinem .pro file ein MSVS 2010 Projekt und kompiliere dieses dann mit MSVS. Üblicherweise läuft der MOC dann nur über meine ganzen GUI Klassen, wenn sich was geändert hat.
Jetzt habe ich Qwt 6.1.0 und QwtPolar 1.1.0 installiert und der MOC läuft jedesmal über meine ganzen GUI Klassen. Dauert bei der Projektgröße ein paar Minuten und nervt sehr. Hat jemand eine Idee, wo ich das wieder abstellen könnte?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: MOC nur bei Bedarf einsetzen (MSVS 2010)

Beitrag von RHBaum »

Generell könntest Du alles was sich "wenig" ändert und viel zeit beim kompilieren beansprucht, in ne eigene Lib und damit eigenes Project auslagern.

Ganz generell und grob gesagt bekommst du das Problem des ständig neukompilierens wenn Du kein Abhängigkeitsmanagment betreibst ....
Aka zirkelbezuege in den headern die wiederum durch die mocs erzeugt werden.
Keine Ahnung wo das bei Dir auftaucht, und ob das nicht durch die Bibs kommt.

Theorethische Grundlagen dazu:
- Forward deklarationen anstatt include
- PIMPL Idom / Compiler Firewalls

google mal.

Ciao ....
bobcat
Beiträge: 125
Registriert: 21. April 2010 14:51

Re: MOC nur bei Bedarf einsetzen (MSVS 2010)

Beitrag von bobcat »

Das meiste davon setze ich in meinem Projekt schon, um, d.h., ich benutze pimpls und forward declarations. Ich habe den Fehler jetzt mal eingegrenzt, ausgehend von einem .pro File, das mit qmake noch ein MSVS Projekt produziert, wo das Problem nicht auftritt. In diesem .pro File wird qwt nicht verwendet, der Fehler liegt also nicht an qwt oder qwtpolar.

Zur Fehlersuche habe Ich zum INCLUDEPATH noch weitere Pfade hinzugefügt, die Pfade existieren und sind leer:

Code: Alles auswählen

INCLUDEPATH += \
# Bisher 33 include Pfade vorhanden.
    pfad1 \
    pfad2 
Der Fehler tritt auf, sobald die Anzahl der Pfade > 34 ist, also, wenn ich sowohl pfad1 als auch pfad2 einbinde. Bis 34 Includepfaden ist alles okay ... hat qmake da einen bug? Und hat jemand eine Idee, was man da machen kann?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: MOC nur bei Bedarf einsetzen (MSVS 2010)

Beitrag von RHBaum »

Klingt ja echt mysteriös :-)
Sicher das nicht der 34.te pfad einfach der ist, der die Zirkelbeziehung reinbringt ?

Da ich mit qmake nicht arbeite, kann ich da ned viel sagen.
Umstieg auf cmake ist sicher keine Option oder ?
Hätte natürlich Vor und Nachteile ...
ich hab aber projekte da komm ich über 50 inklude Pfade (compiler spezifische pfade nicht eingerechnet)

Wobei das eher selten ist das man so viele Pfade in einem Projekt hat. Eigentlich sollte das nen Anstoss sein, deine Projekt-Struktur noch mal zu überdenken.

Ciao ....
chrislo1976
Beiträge: 105
Registriert: 24. Februar 2008 09:45

Re: MOC nur bei Bedarf einsetzen (MSVS 2010)

Beitrag von chrislo1976 »

Hallo!

Leider weiß ich es nicht mehr genau, aber ein Problem mit zu vielen Include-pfaden gibt/gab es schon!
Wir hatten das früher auch als wir QMake und VisualStudio verwendet haben.

Mittlerweile nutzen wir CMake, und da gibt es dieses Problem nicht.

Sollte ich dazu noch was konkretes finden meld ich mich nochmal!


Edit: Hab jetzt was gefunden, hier die Erklärung die ich damals meinem Team geschrieben habe:
Ab einer Anzahl von 40 Includeverzeichnissen in der PRO-Datei (INCLUDEPATH) werden die notwendigen Angaben für die Custom Build Steps in eine temporäre Datei geschrieben und der MOC damit gefüttert.
Problem ist hierbei, dass diese temporäre Datei auch in die Abhängigkeiten mit eingetragen und für jeden Header gleich benannt wird. Bevor nun das Projekt kompiliert wird, prüft VS ob eine der Dateien unter "Abhängigkeiten" ein neueres Datum hat, als die jeweilige Ausgabedatei. Und da die temporäre Datei für jeden einzelnen Header neu geschrieben wird, ist das (bis auf den letzten) bei allen Headern der Fall.

=> Und schon wird auch ohne jegliche Änderung der MOC durchgeführt, und damit die entsprechende Kompilierung...
Gruß
Christian
Antworten