Forum: PC-Programmierung Qt5->6: Compilefehler bei WSJT-X


von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ich versuche gerade, WSJT-X auf Qt6 zu compilieren. Die 
CMake-Infrastruktur habe ich soweit angepasst, aber jetzt stolpere ich 
über ein MOC-generiertes File. Der Compiler beschwert sich hier über 
ungültige Template-Argumente:
1
const QMetaObject QCP::staticMetaObject = { {
2
    nullptr,
3
    qt_meta_stringdata_QCP.offsetsAndSize,
4
    qt_meta_data_QCP,
5
    nullptr,
6
    nullptr,
7
qt_incomplete_metaTypeArray<qt_meta_stringdata_QCP_t
8
, QtPrivate::TypeAndForceComplete<QCP, std::true_type>
9
10
11
12
>,

QCP kommt aus dem Headerfile:
1
/*!
2
  The QCP Namespace contains general enums, QFlags and functions used throughout the QCustomPlot
3
  library.
4
  
5
  It provides QMetaObject-based reflection of its enums and flags via \a QCP::staticMetaObject.
6
*/
7
#ifndef Q_MOC_RUN
8
namespace QCP {
9
#else
10
class QCP { // when in moc-run, make it look like a class, so we get Q_GADGET, Q_ENUMS/Q_FLAGS features in namespace
11
  Q_GADGET
12
  Q_ENUMS(ExportPen)
13
  Q_ENUMS(ResolutionUnit)
14
  Q_ENUMS(SignDomain)
15
  Q_ENUMS(MarginSide)
16
  Q_FLAGS(MarginSides)
17
  Q_ENUMS(AntialiasedElement)
18
  Q_FLAGS(AntialiasedElements)
19
  Q_ENUMS(PlottingHint)
20
  Q_FLAGS(PlottingHints)
21
  Q_ENUMS(Interaction)
22
  Q_FLAGS(Interactions)
23
  Q_ENUMS(SelectionRectMode)
24
  Q_ENUMS(SelectionType)
25
public:
26
#endif

Wenn das MOC-generierte File compiliert wird, ist irgendwie Q_MOC_RUN 
nicht gesetzt, obwohl das scheinbar erwartet werden würde. Wann und wie 
sollte das denn gesetzt sein?

Wenn ich das #ifdef entferne, erbricht sich das Compilieren an anderen 
Stellen.

Kann mir einer kurz erklären, auch welchen Files MOC was generiert?

von Oliver S. (oliverso)


Lesenswert?

1
#ifndef Q_MOC_RUN
2
namespace QCP {
3
#else
4
class QCP

ist halt ein Hack aus qcutomplot, um die enum-Werte in Q_ENUM nutzen zu 
können. Der Hack kanllt jetzt. Mit Qt6.4 generiert MOC eine 
Templateklasse mit QPC als Argument, das ist aber im Compilerlauf ein 
namespace.

Man kann den namespace umbenennen (hat dann aber die 
Q_ENUM-Funktionalität nicht mehr), oder zurückgehen auf Qt6.3.

https://www.qcustomplot.com/index.php/support/forum/2641

Oliver

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Oliver S. schrieb:
> Man kann den namespace umbenennen

Stellt sich mir nur die Frage, welche Konsequenzen das dann hat … Ich 
bin ja eigentlich nur Nutzer der Software, kein Programmierer. ;-)

Was hieße das denn konkret? Einfach
1
namespace Q_CP {

statt des ganze Rassels da oben? Generiert er irgendwie die QCP-Klasse 
von allein? Dann müsste ich wohl nur noch gucken, ob die enums am Ende 
überhaupt benutzt worden sind.

Die Vogel-Strauß-Variante (zurück auf älteres Qt) würde ich nicht haben 
wollen. Im Moment baut WSJT-X eh noch alles mit Qt5. Wenn ich jetzt 
einen Port für Qt6 angehe, dann sollte er halbwegs zukunftssicher sein.

: Bearbeitet durch Moderator
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Danke für den Hinweis auf den Thread dort: durch die Info, dass sie ihre 
letzte Version mit Qt 6.4.0 bereits getestet hatten, habe ich mal die in 
WSJT-X vorhandene durch den letzten Release ersetzt. Damit lässt sich 
diese Stelle compilieren (jetzt kracht es woanders, aber das ist 'ne 
ganz andere Baustelle dann).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.