Qt5->6: Compilefehler bei WSJT-X

OP Moderator Persönliche Seite #7404861

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?

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

OP Moderator Persönliche Seite

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.

OP Moderator Persönliche Seite

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).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 3 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.