[QT] moc-Dateien von Q_OBJECT in cpp werden in Release-Konfigurationen nicht erzeugt



  • Hi,

    ich nutze Visual Studio 2013 mit VS-Plugin QT5.4.

    ich habe in meinen cpp-Dateien wegen pimpl hin und wieder ein Q_OBJECT. Da ich die Signals/Slots verwenden möchte, inkludiere ich am Ende der Datei "bla.moc". Auf wundersame Weise (welche?) werden ja dann normalerweise die benötigten moc-Dateien erzeugt. Das klappt bei mir jetzt aber nur im Debug und nicht im Release.

    Ich verstehe leider nicht, an welcher Stelle und durch welche Konfiguration die moc-Dateien überhaupt erstellt werden. Normalerweise erledigt das qmake, aber wann ruft VS qmake überhaupt auf? Und wie parst qmake Dateien, um rauszufinden, welche moc-Dateien erstellt werden sollen?

    Irgendwas an diesem Prozess funktioniert für Debug, aber anscheinend einfach nicht für Release, weil die moc-Dateien nur für .h-Dateien aber nicht für .cpp-Dateien erzeugt wird. Bei .h ist mir das ja sogar wiederum klar, weil das "benutzerdefiniert kompiliert" wird, d.h. die Datei selbst hat einfach bestimmte Einstellungen.

    Wann und wie die cpp-Dateien, die ja normal mit cpp-Compiler aufgerufen werden, ge-moc-t werden, ist mir jedoch absolut unklar. Daher finde ich auch den Fehler nicht. 😞

    Hat jemand eine Idee?

    Edit:
    Zusatzinfo, ich habe mir die vcxproj-Datei mal angeschaut und folgendes gefunden:

    <CustomBuild Include="GeneratedFiles\Debug\MyClass.moc">
          <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
          <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;.\ui\controller\MyClass.cpp</AdditionalInputs>
          <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing MyClass.cpp...</Message>
          <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\%(Filename).moc</Outputs>
          <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe"  "ui\controller\MyClass.cpp" -o ".\GeneratedFiles\$(ConfigurationName)\%(Filename).moc"  -DQT_NO_KEYWORDS -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg"</Command>
        </CustomBuild>
    

    Denselben Eintrag gibt es für Release nicht. Wenn ich den Eintrag manuell für Release einfüge, moct er die cpp auch. Aber wie kriege ich es hin, dass er so einen Eintrag selbst für alle Konfigurationen erstellt? Wie gesagt finde ich in den Projekteinstellungen zwischen den Konfigurationen einfach keinen Unterschied.

    Gruß
    Eisflamme



  • Ich habe es mir nicht komplett durchgelesen, aber vllt. hilft dir Qt, CMake, Visual Studio and Q_OBJECT in cpp files?

    Ansonsten kannst du es auch von Hand erstellen: Custom build rules for QT under Visual Studio 2010



  • Hi,

    von cmake habe ich noch nie was gehört... ich glaube, ich nutze das auch nicht, ich habe diesbzgl. auch noch nie etwas konfiguriert. Die Threads dazu las ich trotzdem, half mir aber nichts.

    Dein zweiter Link klappt für h-Dateien, das könnte ich einstellen. Aber wie auch Thread1 sagt: Man kann für eine Datei eben nicht gleichzeitig C/C++-Compiler und Custom Build Rule einstellen, genau das bräuchte ich hier aber. Er soll mir die cpp mocen und gleichzeitig das Ding kompilieren. 😞



  • Nochmal hi,

    jetzt klappt es...

    das VS-Plugin ist wirklich extrem willkürlich, man sollte zumindest nochmal einen Extra-Suchlauf nach Q_OBJECT und #include "*.moc" manuell starten können, damit wären viele Probleme behoben.

    Eine Sache, die evtl. gestört hat (obwohl's manchmal auch ging), war, dass ich:

    #include "MyObject.moc"
    

    manchmal nicht in der letzten Zeile der cpp-Datei hatte, sondern vor der schließenden Klammer } des jeweiligen namespaces.

    Das half auch noch nicht. Ich habe die Zeile gelöscht und gespeichert, wieder hingeschrieben und nochmal gespeichert. Wenn - und das kommt nicht immer vor - Visual Studio dann plötzlich sichtlich irgendetwas macht, weil der Mauscursor wenige Sekunden zum Lade-Icon wird, dann ist irgendwo irgendwas passiert (absolut nicht sichtbar) und ein erneutes Kompilieren des kompletten Projects bewirkt, dass auch die jeweilige cpp-Datei gemoct wird.

    Absolut untransparent 👎 Wenn jemand meinem Verständnis helfen kann, wäre ich darüber hocherfreut. Ich hoffe, es funktioniert jetzt mit dem "Speichern-Trick" erstmal. 🙂



  • Eisflamme schrieb:

    Auf wundersame Weise (welche?) werden ja dann normalerweise die benötigten moc-Dateien erzeugt.

    Du musst qmake ausführen. Alles andere interessiert mich gar nicht erst. Ich hab das VS Plugin noch nie benutzt. Selbst wenn das versuchen sollte, sowas automatisch zu erkennen und im Hintergrund qmake aufzuführen (davon weiß ich nichts), würde ich mich nicht darauf verlassen. Immer, wenn ich etwas verändere, was einen qmake Aufruf braucht, rufe ich eben qmake auf.



  • Hi,

    wie nutzt du qmake denn? Nach dem, was ich gelesen habe, kann es makefiles oder vcxproj-files erstellen. Aber dann gehen ja auch andere Projekteigenschaften verloren, z.B. Abhängigkeiten von props-Dateien?!

    Zudem habe ich keine pro-Datei (zurzeit), deswegen fehlt auch diese Basis für eine vcxproj-Erstellung.

    Würde mich interessieren, wie hier dein Verfahren ist. Die Ideen der Leute, die online was dazu geschrieben haben, fand ich immer reichlich umständlich.

    Viele Grüße
    Eisflamme



  • Ich hab natürlich pro Dateien. qmake rufe ich einfach auf der Kommandozeile auf, qmake -tp vc. Das erzeugt dann die VS Projekte und die Solution, alle benötigten Einstellungen kann man in die pro Datei schreiben. Das kann zumindest alles, was ich brauche. In der Arbeit haben wir das aber schon erweitert, weil das tatsächlich nicht alles unterstützt, was wir brauchen. Die Idee ist aber natürlich, alle Einstellungen in die pro Datei zu schreiben und sich dann "richtige" VS Projektdateien generieren zu lassen.



  • Also konkret befürchte ich, dass ich nicht so gut include/lib-Abhängigkeiten verwalten kann wie normalerweise bei einem msvc-Projekt.

    Ich share über git z.B. libs/include-Verzeichnisse nicht, weil je nach System, auf dem gearbeitet wird, die Verzeichnisse woanders liegen. Also habe ich eine props-Datei pro System und die kann man dann ja gleich benennenn, ins gleiche Verzeichnis legen und enthält auch bei sonst geänderter vcxproj alles, was ich benötige.

    Kriege ich das mit qmake auch so gut hin?



  • Zu Hause hab ich mir das mal gespart und gebe einfach absolute Pfade an.
    In der Arbeit haben wir ein großes Repository, in dem auch 3rd party Libs usw. eingecheckt sind und wir können alle Pfade relativ angeben.
    Wie das mit den props Dateien genau funktioniert weiß ich nicht. Wahrscheinlich werden die in der vcxproj Datei angegeben, d.h. qmake würde die Referenz überschreiben. Also müsstest du entweder qmake entsprechend anpassen (ich würd mal in generators/win32/msvc_objectmodel.cpp schauen), oder du schreibst ein kleines Script in der Sprache deiner Wahl, das die Projektdateien nachträglich anpasst. Ist nur XML, sollte kein Problem sein.
    Ich muss mich aber grad wundern, wie das mit dem VS Plugin funktioniert. Ich hätte eigentlich schon erwartet, dass das auch auf qmake basiert und nur das kann, was qmake kann, also die props Dateien wieder rausschmeißen würde.



  • Dann wird das wohl eine Art merge vornehmen, denn das bleibt tatsächlich immer brav drin.


Log in to reply