3 votes

QT5 et Antlr4.8 ne compilent pas avec Cmake et QT Creator

Comme dans l'exemple ci-dessus, j'essaie de compiler un projet QT5 dans QT Creator avec cmake et je veux ajouter le paquet antlr.

Infos : Qt 5.12.8, Antlr 4.8, Compilateurs essayés : mingw gcc|g++ , msvc 2015,2017 Système : Windows / Linux les deux ne fonctionnent pas

Pour inclure Antlr 4.8, j'utilise le paquet CPP fourni pour construire Antlr à partir des sources.

Voici le projet sur lequel je travaille. https://github.com/MrDiver/ArmSimulator/tree/ArmParser/src/asmeditor/AsmEditor

J'ai inclus antlr4 avec les éléments suivants https://github.com/MrDiver/ArmSimulator/blob/ArmParser/src/asmeditor/AsmEditor/CMakeLists.txt#L14-L21

et normalement il fonctionne parfaitement bien quand je compile quelque chose avec lui. Mais cette fois-ci, lorsque j'essaie d'inclure les fichiers d'en-tête pour antlr, j'obtiens ce message d'erreur

FAILED: CMakeFiles/AsmEditor.dir/managers/processormanager.cpp.obj 
H:\Programme\QT\Tools\mingw730_64\bin\g++.exe  -DANTLR4CPP_STATIC -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_WIDGETS_LIB -I. -IH:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor -IAsmEditor_autogen/include -Iantlr4_runtime/src/antlr4_runtime/runtime/Cpp/runtime/src -IH:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor/armparser/assembler -IH:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor/armparser/walker -IH:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor/codearea -IH:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor/managers -IH:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor/armparser -isystem H:/Programme/QT/5.12.8/mingw73_64/include -isystem H:/Programme/QT/5.12.8/mingw73_64/include/QtWidgets -isystem H:/Programme/QT/5.12.8/mingw73_64/include/QtGui -isystem H:/Programme/QT/5.12.8/mingw73_64/include/QtANGLE -isystem H:/Programme/QT/5.12.8/mingw73_64/include/QtCore -isystem H:/Programme/QT/5.12.8/mingw73_64/./mkspecs/win32-g++ -O3 -DNDEBUG   -std=gnu++11 -MD -MT CMakeFiles/AsmEditor.dir/managers/processormanager.cpp.obj -MF CMakeFiles\AsmEditor.dir\managers\processormanager.cpp.obj.d -o CMakeFiles/AsmEditor.dir/managers/processormanager.cpp.obj -c H:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor/managers/processormanager.cpp
In file included from antlr4_runtime/src/antlr4_runtime/runtime/Cpp/runtime/src/antlr4-runtime.h:31:0,
                 from H:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor/managers/processormanager.cpp:2:
antlr4_runtime/src/antlr4_runtime/runtime/Cpp/runtime/src/Lexer.h:116:46: error: invalid declarator before 'newToken'
     virtual void emit(std::unique_ptr<Token> newToken);
                                              ^~~~~~~~
antlr4_runtime/src/antlr4_runtime/runtime/Cpp/runtime/src/Lexer.h:116:46: error: expected ')' before 'newToken'
antlr4_runtime/src/antlr4_runtime/runtime/Cpp/runtime/src/Lexer.h:123:25: error: expected unqualified-id before ')' token
     virtual Token* emit();
                         ^
[30/31 0.6/sec] Building CXX object CMakeFiles/AsmEditor.dir/armparser/assembler/ARMParser.cpp.obj
ninja: build stopped: subcommand failed.
18:59:55: The process "C:\msys64\mingw64\bin\cmake.exe" exited with code 1.
Error while building/deploying project AsmEditor (kit: Desktop Qt 5.12.8 MinGW 64-bit)
When executing step "CMake Build"

Dossier d'intérêt : https://github.com/MrDiver/ArmSimulator/blob/ArmParser/src/asmeditor/AsmEditor/managers/processormanager.cpp

On dirait que ça ne peut pas trouver std::unique_ptr<Token> mais je ne peux pas changer grand chose à ce sujet, car ce sont les sources d'antlr et elles fonctionnent réellement.

Je ne sais donc plus vraiment où chercher le problème. La bibliothèque elle-même compile bien si je la choisis comme cible dans les paramètres.

Ce que j'ai essayé :

  • Compiler la bibliothèque antlr en dehors et la lier simplement dans le fichier cmake.
  • Changer le Lexer.h avec #include <memory> .
  • Compilation du projet QT sans QT Creator (ce qui entraîne une tonne d'erreurs supplémentaires car je n'arrive pas à faire fonctionner la liaison pour QT).
  • Compilation de tous les fichiers relatifs à Antlr en dehors du projet (fonctionne parfaitement sans QT mais ce n'est pas vraiment ce dont j'ai besoin).
  • Utilisation de différents compilateurs et de différents systèmes.
  • Recherche d'un problème avec moc mais cela ne semble pas l'influencer. Mais je doute que j'aie suffisamment regardé sur le moc pour cela.

Et je suis assez nouveau à QT donc je ne sais pas tout ce que le Qt Creator fait dans les coulisses. C'est un peu trop si je ne peux pas le compiler avec un simple cmake.

Merci d'avance pour votre aide.

5voto

eyllanesc Points 79506

Le problème est que Antlr a des méthodes comme "emit" qui entrent en conflit avec le mot réservé "emit" de Qt. La solution est de désactiver le drapeau "no_keywords" (dans qmake add CONFIG += no_keywords et dans CMake, ajoutez add_definitions(-DQT_NO_KEYWORDS) ) comme indiqué par les docs . Vous devez ensuite effectuer les conversions suivantes :

emit to Q_EMIT
slot to Q_SLOT
slots to Q_SLOTS
signal to Q_SIGNAL
signals to Q_SIGNALS

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X