Februar
06.

Qt moc ab Boost 1.48

Versucht man in einem Qt Projekt eine aktuelle Boost Version einzubinden, wird man schnell feststellen, dass der Qt moc-Compiler nicht durch die Header von Boost kommt.

.../boost/mpl/if.hpp(131): Warning: Macro argument mismatch.
.../boost/mpl/eval_if.hpp(67): Warning: Macro argument mismatch.
.../boost/mpl/void.hpp(71): Warning: Macro argument mismatch.
.../boost/mpl/begin_end.hpp(52): Warning: Macro argument mismatch.
.../boost/mpl/negate.hpp(52): Warning: Macro argument mismatch.
...
*snip*
...NMAKE : fatal error U1077: 'C:\Qt\5.2.0\msvc2012\bin\moc.exe' : return code '0xc0000005'
Stop.

Der moc-Compiler aus Qt 5.2 erzeugt statt Fehler nur noch Warnings, werden davon genug erzeugt, bricht das Tool trotzdem mit einem Fehler ab.

Es bleibt zur Zeit nur der Workaround, die Boost-Includes vor dem Moc-Compiler zu verstecken.

Beispiel:


#ifndef Q_MOC_RUN
#  include <boost/serialization.h>
#endif

Will man ein bestehendes Qt-Projekt auf eine neue Boost Version heben, ist es natürlich sehr mühselig den Include-Guard überall im Code einzufügen.
Mit den RegExp-Ersetzen von Sublime Text kann dies mit folgenden Ausdrücken automatisiert werden.

 Find: ((\n#include <boost/[^\n]+)+)
 Replace: \n#ifndef Q_MOC_RUN\1\n#endif

Wir haben in unserem Branch von QxORM bei Github die notwendigen Anpassungen bereits umgesetzt.

© 2012 – 2024 HicknHack Software GmbH | Impressum | Datenschutzerklärung